Вот две очень простые функции f
и g
.
{-# LANGUAGE ScopedTypeVariables #-}
module Test where
import Control.Applicative
f :: IO ()
f = do
y <- (<*>) (pure (show . (*10))) (read <$> readFile "data")
writeFile "out" y
g :: IO ()
g = do
y <- (readFile "data" >>= return . show . (*10) . read)
writeFile "out" y
Файл читается и *10
в f
пишется в аппликативном стиле с pure
и (<*>)
. Файл читается и *10
в g
записывается в монадическом стиле, с >>=
. (Я намеренно избегал использования liftM
в g
, чтобы подчеркнуть вопрос ниже).
В чем семантическая разница между f
и g
? Или в данном случае это просто стилистический выбор?
(<*>) (pure (show . (*10))) (read <$> readFile "data")
какshow . (*10) . read <$> readFile "data"
- person bennofs   schedule 30.11.2013<-
иreturn
вg
в основном компенсируют друг друга,do { y <- readFile "data"; writeFile "out" (show . (*10) . read $ y) }
будет короче (и, возможно, менее надуманным). - person Frerich Raabe   schedule 30.11.2013