繁体   English   中英

Haskell / Frege <= <和= <<关联性

[英]Haskell/Frege <=< and =<< associativity

根据Hoogle的说法, <=< (Kleisli monad组成,或“左鱼”)和=<< (反向monad bind)的infixr 1infixr 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM