【问题标题】:Haskell/Frege <=< and =<< associativityHaskell/Frege <=< 和 =<< 关联性
【发布时间】:2016-10-06 14:32:29
【问题描述】:

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

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

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

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

但由于某种原因,虽然第一个表达式在 Haskell 中似乎无效,但正如预期的那样,弗雷格似乎没有抱怨,并在 =&lt;&lt; 之前评估 &lt;=&lt;

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

foo >>= (bar <=< baz)

点免费,它给了我

bar <=< baz =<< foo

考虑到问题,这看起来不太正确。

【问题讨论】:

    标签: haskell operator-precedence frege


    【解决方案1】:

    弗雷格 Haskell,但弗雷格不是 Haskell。而在 Frege 中,这些运算符的固定性是不同的:=&lt;&lt; is infixr 2&lt;=&lt; is infixr 3。所以由于&lt;=&lt;的优先级较低,bar &lt;=&lt; baz =&lt;&lt; foo自然会被解析为(bar &lt;=&lt; baz) =&lt;&lt; foo

    (事实上,=&lt;&lt;&lt;=&lt; 在 Frege 中的 类型 与在 Haskell 中的不同:它们不是 Monad 约束,而是 Bind 约束,其中 @ 987654338@ 就像没有pure/returnMonad。)


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


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

    【讨论】:

    • Frege 中的类型差异可能是因为 AMP(或更激进的 Monad 类层次结构)从一开始就在那里实现,比在 GHC 中完成早几年。我恳请您考虑以此为由否认弗雷格的“哈斯克尔财产”是否公平。在这种强烈的意义上,没有任何后 AMP Haskell 程序实际上是用 Haskell 编写的。这没有任何意义,恕我直言。 (可以肯定的是,我知道还有其他理由拒绝弗雷格获得完整的 Haskell 船。)
    • @Ingo:我试图说“Frege 不是 Haskell,因此它会有所不同也就不足为奇了;事实上,它在这些方面是不同的。”换句话说,我会把因果关系反过来 :-) “Haskell 属性”评论是关于英语使用的评论:弗雷格是我见过的唯一被描述为“Haskell”的语言,所以这是一个用不同寻常的方式来描述它,我认为这很重要,因为它可能会引起混淆。
    • 我不得不承认我对“Haskell for JVM”的口号也不是 100% 满意,这也是我一开始选择不同名称的原因之一。但实际上是 SPJ 本人鼓励我们在这方面更具攻击性,认为(仍然存在的)差异可以忽略不计。我也同意“a”可能有点令人不安。
    • @Ingo:对不起,我没有意识到是Frege的作者!要非常清楚我在说什么:我不反对命名本身 - 我不知道有足够的意见 - 我只是认为这可能令人困惑,尤其是在这个问题的背景下。我没有足够的知识来决定弗雷格是否拥有“完整的 Haskell-ship”;你比我更专业:-)
    • 嘿,不用抱歉,我没有冒犯!正如我所说,我很清楚弗雷格还不在那里。作为记录,我最初想出了“Frege,一种本着 Haskell 精神的 JVM 纯函数式语言”,但后来被驳回,理由是它可能表明与 Haskell 的竞争。但恰恰相反!当然,我的目标是尽可能地“haskellish”。 OTOH,这并不意味着复制 Haskell 中已经暴露的缺点,例如 Monad 不是 Applicative 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多