(>> =)和(> =>)之间的差异

时间:2016-08-22 13:56:19

标签: haskell functional-programming monads

我需要对(>> =)和(> =>)进行一些澄清。

*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评论进行更正

1 个答案:

答案 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