为什么GHC不导入Semigroup((<>))

时间:2019-07-19 19:52:08

标签: haskell

我的讲师为我提供了不在GHCI中构建的代码。据我所知,它已经为我的同学正确建立了。

我指的是

import Data.Semigroup  (Semigroup ((<>)))

GHCI向我抛出此错误

Module ‘Data.Semigroup’ does not export ‘Semigroup((<>))’

这行得通吗?我的GHC版本可能有问题吗?所有其他导入语句都有效。

2 个答案:

答案 0 :(得分:7)

最终编辑

  

我的GHC版本可能有问题吗?

是的,绝对有问题,太老了,准确地说:

GHC-6.12 / base-4.2(从2010年开始,这是Semigroup软件包的发布时间)–非常感谢@leftaroundabout和@Thomas M. DuBuisson的贡献!

该软件包没有(Semigroup ((<>)))函数。因此,您会看到错误。

  

编辑2

发表评论后,我也尝试重现OP环境以重现错误,我在ghc版本7.10.3中安装了堆栈,这就是stack.yaml文件的样子:

resolver: lts-6.27 
system-ghc: false
packages:
- .

并且在破坏了包含以下内容的Main.hs文件的基本堆栈项目之后:

module Main where

import Data.Semigroup

main :: IO ()
main = do
  putStrLn "Hello"
  putStrLn "World"

我得到的错误是

/home/damian/test-semigroup/app/Main.hs:3:8:
  

找不到模块“ Data.Semigroup”

Use -v to see a list of the files searched for.    
--  While building package test-semigroup-0.1.0.0 using:
      /home/damian/.stack/setup-exe-cache/x86_64-linux/Cabal-simple_mPHDZzAJ_1.22.5.0_ghc-7.10.3 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.5.0 build lib:test-semigroup exe:test-semigroup-exe --ghc-options ""
    Process exited with code: ExitFailure 1

旧版本也是如此:

  • 适用于ghc-7.10.2的LTS 3.22,

我无法尝试:

  • 适用于ghc-7.8.4的LTS 2.22,于4年之前发布 因为他们要在哪里使用阴谋集团

和  -ghc-7.8.3的LTS 0.7,发布于5年前 因为他们无法将其安装在64位操作系统上...

因此,可以肯定地说,我一一尝试了所有较新的LTS版本,是的...一一尝试,虽然花了一些时间但值得一试:

  • 适用于ghc-8.6.5的LTS 13.29,今天发布
  • 适用于ghc-8.6.4的LTS 13.19,于3个月前发布
  • 适用于ghc-8.6.3的LTS 13.11,发布于4个月前
  • 适用于ghc-8.4.4的LTS 12.26,发布于7个月前
  • 适用于ghc-8.4.3的LTS 12.14,发布于9个月前
  • 适用于ghc-8.2.2的LTS 11.22,发布于11个月前
  • 一年前发布的适用于ghc-8.0.2的LTS 9.21
  • 适用于ghc-8.0.1的LTS 7.24,发布于2年前

所有ghc版本都无法重现您的日志错误,因此我想尝试输入错误:

import Data.Semigroup (Semigroup ((<$>)))

import Data.Semigroup (Semigroup ((=>>)))

那些给了我你错误:

/home/damian/test-semigroup/app/Main.hs:3:24:错误:

  

模块“ Data.Semigroup”不导出“ Semigroup(())”

  1. 这意味着Data.Semigroup模块已存在于您的ghc
  2. Semigroup((<>))不是该模块的一部分

这意味着,您必须拥有最旧的ghc版本之一...

所以,我认为您可以尝试:

  • 重新安装您的ghc,然后尝试再次运行它。
  • 请考虑使用某些工具,例如stack
  • 检查您的代码,找出一些错别字或奇怪的地方

我认为我的第一个答案很接近:

  

编辑1

已在 ghc版本8.0.1

中添加

快速搜索总是有帮助的:

Here的第一个链接是半组<>,(<>) :: Semigroup a => a -> a -> a

它说:

enter image description here

此版本自2016年5月起可用,ghc版本为8.0.1

要查看ghc的所有版本及其基本版本:

https://wiki.haskell.org/Base_package

答案 1 :(得分:4)

ThomasM.DuBuisson发现了问题所在(在评论中进行讨论):有三种不同的软件包定义了Data.Semigroup模块–

  • base。从GHC-8开始,Haskell附带了准组类和-module,因此您无需担心任何事情。有关详细信息,请参见Damian Lattenero's answer
  • semigroups。在GHC-7中,base中没有半组类,但是semigroups包是基础库的半官方部分。实际上,这个确切的模块只是复制到base中。使用半组编写真正向后兼容的代码的方式仍然取决于semigroups包:针对新的GHC版本进行编译时,该包仅使用base模块,仅在旧版本中提供模块本身。参见the .cabal configuration

      if impl(ghc < 7.11.20151002)
        -- starting with GHC 8 these modules are provided by `base`
        hs-source-dirs: src-ghc7
        exposed-modules:
          Data.Semigroup
          Data.List.NonEmpty
    
  • Semigroup是2010年以来的过时软件包。它也可以导出a Data.Semigroup module,但与semigroups软件包不同,它不兼容官方base模块。它确实具有Semigroups类,但其方法称为.++.而不是<>(可能是为了避免与Data.Monoid中的运算符冲突–到目前为止,问题,因为在非常新的版本<> is now in the prelude中,并且已经可以在半组上使用了。

所以,您发生的事情可能是以下情况:

  1. 您尝试编译代码
  2. GHC抱怨Could not find module ‘Data.Semigroup’。那是因为您正在运行旧的编译器。
  3. 这时,您应该做的是安装/依赖semigroups软件包。相反,您安装了Semigroup软件包,很不幸,该软件包不兼容。

有两种解决方案:

  • 使用Cabal-install并允许您使用旧的编译器。 IMO这是 ok ,尽管您应该准备在将来遇到其他依赖项麻烦。如果这样做,则需要在semigroups文件的build-depends中添加.cabal包。
  • 或使用Stack强制使用最新的编译器。选择例如lts-12.14