haskell 中 >> 运算符的逆运算

Inverse of >> operator in haskell

所以我的代码在使用 monad 时看起来与我在使用应用程序和仿函数时看起来很相似,我一直在使用 =<< 而不是 >>=。我也一直在使用 <* 而不是 *> / >>。但是我注意到 <* 不是 *> 什么 =<<>>=.

例如:

print 5 <* print 6

给我:

5
6

当我期待他们以相反的方式打印时,调用 print 6,打印 6,然后结果 () 被丢弃,然后调用 print 5

进一步尝试后,<**> 似乎仅在 return 值上有所不同,而不是函数的组合/排序方式。而 =<<>>= 的适当翻转,包括从左到右的固定性切换。

我想知道为什么会这样(似乎 >>= 是倒退的,但它更适合而不是倒退的 <*> <* *> 组合,即使 >>=<*> 的类型签名被翻转)。我还想知道是否有我可以/应该使用的 << 样式运算符。

作为一个附带问题,当涉及到 =<< 时,左结合性和右结合性什么时候会有所不同,似乎无论你把括号放在哪里,结果都是一样的,虽然我不可否认,只用相当简单的例子进行了测试。

是的,*><* 仅在 return 值上有所不同。

it somehow fits better with the, not backwards, <*> <* *> combination, even though the type signatures of >>= and <*> are flipped

我不会说 >>=<*> 的签名被翻转了。相反, <*> 只是专门用于在其左侧参数中包含一个函数,然后 applied 到右侧参数中的值。您也可以使用 >>= 来执行此操作,请考虑

fs<*>xs ≡ fs >>= \f -> f<$>xs

我认为 << 的 applicative-equivalent 没有太大必要,就像不需要 ++ 的翻转版本一样:只需对 [=] 的参数排序11=] 或 <* 按照您想要的语义所需的顺序排列!

does left vs right associativity even make a difference when it comes to =<<, it seems as though no matter where you put the parenthesis, the result is the same

呃,那是不正确的。右边有parens的版本连well-typed都没有。也许您已经尝试过使用 lambda 的一些示例,但没有在您的 parens?

中考虑到这些