无论如何,“-<”到底是什么?

What the heck is "-<", anyway?

前几天我遇到了一个运算符,-<,它出现在将值绑定到 monad 中的变量的上下文中;具体来说,它看起来像将一个值传递给一个函数,然后将其分配(并可能评估?)给一个存在于 monad 范围内的变量。

用法示例:

myMonad = do
    myVar <- f -< x

关于这个的几个问题:首先,它叫什么?运算符本身无法通过谷歌搜索(Google 不喜欢 <>),而我找到的一个名称“arrow application", usually links to the other kind of Arrow present in Haskell 似乎无关。

其次,为什么大多数学习资源中都没有解释这个运算符? "Gentle Introduction to Monads" 和 LYAH 都没有提及它,大多数 Haskell 运算符列表也放弃了它。 (这被认为是不好的做法吗?)

最后,这是否等同于使用括号,如 (myVar <- f -< x) == (myVar <- (f x))?还是更像是使用 let myVar = (f x)?在任何一种情况下,如果这是它的使用方式,为什么要使用 -< 而不是括号或 $?

没错,就是同一种箭。箭头有糖语法,就像 monad 有糖语法一样。您不能使用 Google 来搜索 -<,但可以使用 Hoogle.

参见:GHC Language Features, Arrow tutorial

箭头语法的文档确实很少。不能使用 $ 而不是 -< 的原因是 -< 将纯值注入箭头,但 -> 只是箭头的一个示例。所以,如果你的箭头是 ->$ 就可以正常工作。还有 monadic 箭头(Kleisli 构造函数创建它们),您可以制作自己的箭头,在这些情况下 -< 是不同的。