gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:30:05 25 4
gpt4 key购买 nike

根据 Hoogle,<=< 的固定性(Kleisli monad 组合,或“左鱼”)和=<< (反向单子(monad)绑定(bind))是infixr 1 .如果我没看错的话,像这样的表达,说

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

应该是无效的,因为它等同于同样无效的
print <=< (return =<< return "foo")

但是由于某种原因,虽然第一个表达式在 Haskell 中似乎无效,但正如预期的那样,弗雷格似乎没有任何提示,并评估 <=<=<< 之前.

当我在 pointfree.io 上搞砸以弄清楚如何制作类似的东西时,我发现了这一点
foo >>= (bar <=< baz)

无积分,它给了我
bar <=< baz =<< foo

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

最佳答案

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

(事实上​​,=<<<=< 在 Frege 中的类型与在 Haskell 中的不同:它们没有 Monad 约束,而是有 Bind 约束,其中 Bind 就像没有 Monadpure |/return .)

是的,Frege describes itself作为“JVM 的 Haskell”,但它们的意思是“Haskell”,因为 Common Lisp 是 Lisp,Scheme 是 Lisp,Clojure 是 Lisp。以这种方式使用“Haskell”很奇怪。看到“用于 JVM 的类似 Haskell 的语言”或更强大的东西会更正常。但弗雷格是如此相似,我明白为什么。

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

关于Haskell/Frege <=< 和 =<< 关联性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39898771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com