BindPrelude中类的定义是:
class Apply m <= Bind m where
bind :: forall a b. m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
它可以作为一个函数读取,它接受两个输入参数,monadic context(m a)和function(a -> m b)中的值,并在monadic context(m b)中返回一个值.
Bind部分应用函数的实例定义为:
instance bindFn :: Bind ((->) r) where
bind m f x = f (m x) x
Run Code Online (Sandbox Code Playgroud)
这是一个采用三个参数的函数.那个类型检查怎么样?
如果我尝试用m a更具体的类型替换我得到(如果我错了,请纠正我):
(((->) ??) a) -> (a -> (((->) ??) b)) -> (((->) ??) b)
Run Code Online (Sandbox Code Playgroud)
这相当于
(?? -> a) -> (a -> (?? -> b)) -> (?? -> b)
Run Code Online (Sandbox Code Playgroud)
假设变量m绑定到(?? -> a),f将得到势必a -> ?? -> b,和x到第二??.
我的推理是否正确?
这是一个采用三个参数的函数.那个类型检查怎么样?
据我所知,在目前的上下文中这个函数签名:
bind m f x = f (m x) x
应该等于:
bind m f = \x -> f (m x) x
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |