[英]Haskell/Frege <=< and =<< associativity
根据Hoogle的说法, <=<
(Kleisli monad组成,或“左鱼”)和=<<
(反向monad bind)的infixr 1
是infixr 1
。 如果我正确地看着它们,就像说的那样
print <=< return =<< return "foo"
应该是无效的,因为它等同于同样无效的
print <=< (return =<< return "foo")
但由于某种原因,尽管第一个表达似乎在Haskell中无效,正如预期的那样,Frege似乎没有抱怨,并且在=<<
之前评估<=<
。
当我在pointfree.io上弄乱如何弄清楚如何制作类似的东西时,我发现了这一点
foo >>= (bar <=< baz)
没有点,它给了我
bar <=< baz =<< foo
考虑到固定性,这看起来不太正确。
Frege 就像 Haskell,但Frege 不是 Haskell。 在弗雷格,这些算子的infixr 2
是不同的: =<<
是infixr 2
而<=<
是infixr 3
。 因此,由于<=<
具有较低的优先级, bar <=< baz =<< foo
自然被解析为(bar <=< baz) =<< foo
。
(事实上, =<<
和<=<
在弗雷格有不同的类型 ,而不是在Haskell中:不是Monad
约束,它们有一个Bind
约束,其中Bind
就像没有pure
/ return
Monad
。)
是的, 弗雷格将自己描述为“一个Haskell的JVM”,但他们的意思是“ 一个 Haskell”在某种意义上说,Common Lisp是一个Lisp和计划是一个Lisp和Clojure是一个Lisp。 看到“Haskell”以这种方式使用是很奇怪的; 看到“JVM的类似Haskell的语言”或更强大的东西更为正常。 但弗雷格非常相似,我可以理解为什么。
另外,你说对了: 确实出现了一个错误pointfree
(即备份程序pointfree.io )! pointfree
应该生成Haskell代码,而不是Frege,因此转换无效的事实意味着它做错了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.