Я пытался разобраться с монадой читателя и наткнулся на это руководство. В ней автор представляет такой пример:
example2 :: String -> String
example2 context = runReader (greet "James" >>= end) context
where
greet :: String -> Reader String String
greet name = do
greeting <- ask
return $ greeting ++ ", " ++ name
end :: String -> Reader String String
end input = do
isHello <- asks (== "Hello")
return $ input ++ if isHello then "!" else "."
Я знаю, что это тривиальный пример, показывающий механику, но я пытаюсь понять, почему это было бы лучше, чем делать что-то вроде:
example3 :: String -> String
example3 = end <*> (greet "James")
where
greet name input = input ++ ", " ++ name
end input = if input == "Hello" then (++ "!") else (++ ".")
ask, asks
. - person chi   schedule 26.03.2018<*>
business, либо eta уменьшитьcontext
. - person dfeuer   schedule 26.03.2018