绑定部分应用函数的类实例

z1n*_*Y5A 2 monads purescript

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到第二??.

我的推理是否正确?

swi*_*ard 6

这是一个采用三个参数的函数.那个类型检查怎么样?

据我所知,在目前的上下文中这个函数签名:

bind m f x = f (m x) x

应该等于:

bind m f = \x -> f (m x) x