什么可以证明lambda表达式中的参数传递给monad?

Pol*_*mer 0 monads haskell

相对于鱼类操作者,Monads满足相关性.

(h >=> g) >=> f = h >=> ( g >=> f)
Run Code Online (Sandbox Code Playgroud)

这转换为bind(与lambda表达式)看起来像,

\a -> h a >>=(\b -> g b >>= \c -> f c) = 
\a ->(h a >>= \b -> g b)>>= \c -> f c
Run Code Online (Sandbox Code Playgroud)

这意味着下面的等式是明确的

( a -> h a >>= \b -> g b >>= \c -> f c ) =  h >=> g >=> f
Run Code Online (Sandbox Code Playgroud)

这是理解Monadic构图的好方法.

但是并非所有Monadic代码都将绑定变量保持为lambdas分开.例如,

[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch) = 
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
Run Code Online (Sandbox Code Playgroud)

返回中的"n"是从顶部lambda获得的.

更普遍,

a -> g a >>= \b -> f a b
Run Code Online (Sandbox Code Playgroud)

f取决于上面的a和b.用f,g和(> =>)定义上述给出

\a -> (\x -> g a) >=> f a 
Run Code Online (Sandbox Code Playgroud)

我不太懂.它与上面我很清楚的方程式不符.我认为鱼是这里的基本概念,我试图理解它是如何与我写的典型Monads相互作用的.我想更好地理解上述内容.

解决此问题的一种方法是尝试从List表达式语法中获取含义

[ (n,ch) | n <- [1, 2], ch <- ['a', 'b'] ]
Run Code Online (Sandbox Code Playgroud)

我认为这意味着一种对称性.

连接lambda表达式和Monads有没有很好的对称性?还是我读了太多这个?我对高度嵌套的lambda表达式的恐惧是错误还是合理?

lef*_*out 5

不,没有任何限制.一旦你绑定了lambda,你就可以做任何事情.这是因为它较弱(因此给你更强的自由定理限制)而更受Applicative青睐的原因之一.Monad

 ( [1,2] >>= \n -> "ab" >>= \ch -> return (n,ch) )
   ?  (,) <$> [1,2] <*> "ab"
   ?  liftA2 (,) [1,2] "ab"
   ?  liftA2 (flip (,)) "ab" [1,2]
Run Code Online (Sandbox Code Playgroud)

最后一个实际上不是一个合适的等式; 仅适用法律保证这些表达式的相同请参阅注释,但结构可以并且将会有所不同.

Prelude Control.Applicative> liftA2 (,) [1,2] "ab"
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
Prelude Control.Applicative> liftA2 (flip (,)) "ab" [1,2]
[(1,'a'),(2,'a'),(1,'b'),(2,'b')]
Run Code Online (Sandbox Code Playgroud)

  • 关于你的评论:`State`是`f <$> x <*> y`和`flip f <$> y <*> x`之间值的相同性的反例 - 例如,`runState((/ )<$>状态((2*)&&&(3*))<*>状态((+4)&&&(减去3)))1`是`(1/7,0)`,但是`runState(翻转) (/)<$> state((+4)&&&(减3))<*> state((2*)&&&(3*)))1`是`( - 4/5,-6)`. (2认同)