我已经学习 Haskell 几个星期了(只是为了好玩),刚刚观看了 Brian Beckman介绍 monad的精彩视频。他激励 monad 需要创建一个更通用的组合运算符。按照这个思路,如果我有两个功能:
f :: a -> b
g :: b -> c
Run Code Online (Sandbox Code Playgroud)
组合运算符应该满足
h = g . f :: a -> c
Run Code Online (Sandbox Code Playgroud)
由此我可以推断出正确的.运算符类型:
(.) : (b -> c) -> (a -> b) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)
说到 monad,假设我有两个功能:
f :: a -> m b
g :: b -> m c
Run Code Online (Sandbox Code Playgroud)
在我看来,自然的选择是定义一个通用的组合运算符,其工作方式如下:
h = f >>= g :: a -> m c
Run Code Online (Sandbox Code Playgroud)
在这种情况下,>>=运算符的类型签名为:
(>>=) :: (a -> …Run Code Online (Sandbox Code Playgroud)