我需要对(>> =)和(> =>)进行一些澄清。
*Main Control.Monad> :type (>>=)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
*Main Control.Monad> :type (>=>)
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
我知道绑定运算符(>> =),但我没有得到(> =>)有用的上下文。请用简单的玩具例子来解释。
编辑:根据@Thomas评论进行更正
答案 0 :(得分:12)
(>=>)
功能有点像(.)
,但它与a -> b
无关,而是与a -> m b
配合使用。
-- Ask the user a question, get an answer.
promptUser :: String -> IO String
promptUser s = putStrLn s >> getLine
-- note: readFile :: String -> IO String
-- Ask the user which file to read, return the file contents.
readPromptedFile :: String -> IO String
readPromptedFile = promptUser >=> readFile
-- Ask the user which file to read,
-- then print the contents to standard output
main = readPromptedFile "Read which file?" >>= putStr
这有点人为,但它说明(>=>)
。与(.)
一样,您不需要 ,但它通常对于以无点样式编写程序非常有用。
请注意,(.)
具有与(>=>)
相反的参数顺序,但(<=<)
也是flip (>=>)
。
readPromptedFile = readFile <=< promptUser