【问题标题】:Why do I need Data.Monoid.(<>) only for older GHC?为什么我只需要旧 GHC 的 Data.Monoid.(<>)?
【发布时间】:2018-10-28 04:57:13
【问题描述】:

在 GHC 8.4 之前的我的 Haskell package builds 中,我需要

import Data.Monoid ((<>))

avoid

• Variable not in scope:
    (<>)

从 GHC 8.4 开始,我没有收到排除此导入的错误。

这是为什么? (&lt;&gt;) 是否已在其他地方实施?为以后的 GHC 做这个导入会有什么后果,在哪里是不必要的?可以有条件地只为较旧的 GHC 导入这个吗?

【问题讨论】:

    标签: haskell package


    【解决方案1】:

    这是为什么?

    因为Semigroup Monoid Proposal

    (&lt;&gt;) 是否已在其他地方实现?

    是的,它在 GHC.Base: 中定义:

    [nix-shell:~]$ ghci
    GHCi, version 8.4.3: http://www.haskell.org/ghc/  :? for help
    Prelude> :t (<>)
    (<>) :: Semigroup a => a -> a -> a
    Prelude> :info (<>)
    class Semigroup a where
      (<>) :: a -> a -> a
      ...
            -- Defined in ‘GHC.Base’
    infixr 6 <>
    Prelude>
    

    为以后的 GHC 做这个导入会有什么后果,在哪里是不必要的?

    到目前为止,还没有,因为 Data.Monoid 重新导出 (&lt;&gt;)。如果我正确阅读了该提案,则没有取消该再出口的计划。

    是否可以有条件地仅对较旧的 GHC 进行此导入?

    是的,通过 CPP 看到这里 conditional exclude it 感谢 orome。

    由于Semigroup 在提案的第 2b 阶段成为Monoid 的超类,并且在 GHC 8.4 中完成,您可以检查 base 的版本是否大于 4.11.0.0,您可以查找 @987654323 @。

    【讨论】:

    • 所以,虽然一般来说,这里的一种方法可能是 conditionally exclude it 用于以后的 GHC,在这种情况下这是不必要的(因为所有导入所做的都是从 GHC.Base 获取相同的实现?
    • 是的,您可以简单地将import Data.Monoid ((&lt;&gt;)) 留在您的代码中。
    • 我可以建议你在未来让标题少一点面对面吗? (### 而不是 #。)
    • @leftaroundabout 可以说,这是 Markdown 渲染器的问题;顶级标题应该在较低级别标题之前使用。
    • 现在标题更好了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2012-05-21
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多