Monad在haskell中的关联性规则

sno*_*now 9 monads haskell associativity

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

有什么不同f\x->f x

我认为它们属于同一类型a -> m b.但似乎>>=等式右边的第二个对象的类型\x->f xm b.出了什么问题?

C. *_*ann 15

对于大多数目的而言,表达f\x -> f x做法意味着同样的事情.但是,lambda表达式的范围尽可能向右延伸,即m >>= (\x -> (f x >>= g)).

如果类型是m :: m a,f :: a -> m bg :: b -> m c,那么在左边我们有(m >>= f) :: m b,而在右边我们有(\x -> f x >>= g) :: a -> m c.

因此,两个表达式之间的差异(>>=)就是执行操作的顺序,非常类似于表达式,1 + (2 + 3)并且(1 + 2) + 3仅在执行添加的顺序上有所不同.

monad法律要求,与添加一样,两者的答案应该相同.

  • 只是评论:`\ x - > fx >> = g`与`f> => g`相同.(Kleisli鱼) (3认同)
  • 实际上,Typeclassopedia认为,这个定律在`(> =>)`方面更加优雅,回想起这基本上是构成.我作为学习者同意. (3认同)
  • @delnan:我很快就会写出来; 他们是幺mon定律,`(<= <)`作为运算符,`return`作为身份,毕竟,不妨这么做. (2认同)