Haskell/Frege <=< 和 =<< 结合性

Haskell/Frege <=< and =<< associativity

根据Hoogle,<=<(Kleisli monad 组合,或"left fish")和=<<(反向monad 绑定)的固定性是infixr 1 .如果我没看错的话,像 say

这样的表达式
print <=< return =<< return "foo"

应该是无效的,因为它等同于同样无效的

print <=< (return =<< return "foo")

但不知为何,虽然第一个表达式在Haskell中似乎是无效的,但正如预期的那样,弗雷格似乎毫无怨言,在=<<之前计算了<=<

我在 pointfree.io 上闲逛时发现了这个,想弄清楚如何制作类似

的东西
foo >>= (bar <=< baz)

免分,给了我

bar <=< baz =<< foo

考虑到固定性,这看起来不太正确。

弗雷格喜欢Haskell,但弗雷格Haskell。而在弗雷格那里,这些运算符的固定性是不同的:=<< is infixr 2 and <=< is infixr 3。所以由于 <=< 具有较低的优先级, bar <=< baz =<< foo 自然被解析为 (bar <=< baz) =<< foo.

(事实上,=<<<=< 在 Frege 中的 类型 与在 Haskell 中的不同:而不是 Monad 约束,他们有一个 Bind 约束,其中 Bind 就像没有 pure/returnMonad。)


是的,Frege describes itself 和 "a Haskell for the JVM" 一样,但它们的意思是“a Haskell”,在 Common Lisp 是 Lisp 的意义上, Scheme 是 Lisp,Clojure 是 Lisp。看到以这种方式使用 "Haskell" 很奇怪;看到 "a Haskell-like language for the JVM" 或更强的东西会更正常。但弗雷格是如此相似,我明白为什么了。


此外,您是对的: 似乎是 pointfree (the program that backs pointfree.io 中的错误)! pointfree 应该生成 Haskell 代码,而不是 Frege,所以该转换无效的事实意味着它做错了事。