根据Hoogle的说法,<=< (Kleisli组合物,或称“左鱼”)和=<< (反向monad )的固定性是infixr 1。如果我没看错的话,比如说
print <=< return =<< return "foo"应该是无效的,因为它相当于同样无效的
print <=< (return =<< return "foo")但出于某种原因,虽然第一个表达式在Haskell中似乎是无效的,但正如预期的那样,Frege似乎没有抱怨,并在<=<之前对=<<进行了评估。
当我在pointfree.io上乱搞找出如何制作类似的东西时,我发现了这一点。
foo >>= (bar <=< baz)没有积分,它给了我
bar <=< baz =<< foo从固定的角度来看,这看上去不太对。
发布于 2016-10-06 16:23:02
弗雷奇就像哈斯克尔,但弗雷格不是哈斯克尔。在Frege中,这些算子的固定点是不同的:infixr 2和infixr 3。因此,由于<=<的优先级较低,因此bar <=< baz =<< foo自然被解析为(bar <=< baz) =<< foo。
(实际上,=<<和<=<在Frege中的类型与在Haskell中的不同:它们没有Monad约束,而是有Bind约束,其中Bind类似于没有pure/return的Monad。)
是的,弗雷格是“JVM的Haskell”,但它们的意思是“一个Haskell”,即Common是Lisp,Scheme是Lisp,Clojure是Lisp。以这种方式使用"Haskell“是很奇怪的;看到”用于JVM的类似Haskell的语言“或其他更强的语言会更正常。但弗雷格是如此的相似,我能理解为什么。
而且,您也是对的:这似乎是pointfree (支持pointfree.io的程序)中的一个bug!pointfree应该生成Haskell代码,而不是Frege,所以转换无效的事实意味着它做了错误的事情。
https://stackoverflow.com/questions/39898771
复制相似问题