5

根据 Hoogle 的说法,<=<(Kleisli monad composition,或“left fish”) 和=<<(reverse monad bind) 的固定性是infixr 1. 如果我没看错的话,像这样的表达,说

print <=< return =<< return "foo"

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

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

但是由于某种原因,尽管第一个表达式在 Haskell 中似乎无效,但正如预期的那样,弗雷格似乎没有抱怨,并且<=<=<<.

当我在 pointfree.io 上搞砸以弄清楚如何制作类似的东西时,我发现了这一点

foo >>= (bar <=< baz)

无积分,它给了我

bar <=< baz =<< foo

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

4

1 回答 1

6

Frege就像Haskell,但 Frege不是Haskell。在 Frege 中,这些运算符的固定性是不同的:=<<isinfixr 2<=<isinfixr 3。所以由于<=<优先级较低,bar <=< baz =<< foo自然会被解析为(bar <=< baz) =<< foo.

(事实上​​,在 Frege 中的类型=<<与在 Haskell 中<=<不同:它们没有约束,而是有约束,就像没有/一样。)MonadBindBindMonadpurereturn


是的,弗雷格将自己描述为“JVM 的 Haskell”,但在 Common Lisp 是 Lisp、Scheme 是 Lisp、Clojure 是 Lisp 的意义上,它们的意思是“ Haskell ”。以这种方式使用“Haskell”很奇怪。看到“用于 JVM 的类似 Haskell 的语言”或更强大的东西会更正常。但弗雷格是如此相似,我明白为什么。


另外,你是对的:这似乎是(支持pointfree.iopointfree的程序)中的一个错误! 应该生成Haskell代码,而不是 Frege,所以转换无效的事实意味着它做错了事。pointfree

于 2016-10-06T16:23:02.620 回答