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

Ewa*_*own 2 haskell

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

我指的代码是

import Data.Semigroup  (Semigroup ((<>)))
Run Code Online (Sandbox Code Playgroud)

GHCI向我抛出此错误

Module ‘Data.Semigroup’ does not export ‘Semigroup((<>))’
Run Code Online (Sandbox Code Playgroud)

应该行吗?我的GHC版本可能有问题吗?所有其他导入语句均有效。

Dam*_*ero 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:
- .
Run Code Online (Sandbox Code Playgroud)

在破坏了包含Main.hs文件的基本堆栈项目之后:

module Main where

import Data.Semigroup

main :: IO ()
main = do
  putStrLn "Hello"
  putStrLn "World"
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

/home/damian/test-semigroup/app/Main.hs:3:8:
Run Code Online (Sandbox Code Playgroud)

找不到模块“ 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
Run Code Online (Sandbox Code Playgroud)

较旧的版本也是如此:

  • 适用于ghc-7.10.2的LTS 3.22,

我无法尝试:

  • LTS 2.22 for ghc-7.8.4,于4年前发布,因为它们要在哪里使用Cabal运行

--ghc-7.8.3的LTS 0.7,发布于5年前,因为我无法将其安装在64位OS中...

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

  • 适用于ghc-8.6.5的LTS 13.29,今天发布
  • LTS 13.19 for ghc-8.6.4,于3个月前发布
  • LTS 13.11 for ghc-8.6.3,于4个月前发布
  • 适用于ghc-8.4.4的LTS 12.26,于7个月前发布
  • LTS 12.14 for ghc-8.4.3,于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 ((<$>)))
Run Code Online (Sandbox Code Playgroud)

要么

import Data.Semigroup (Semigroup ((=>>)))
Run Code Online (Sandbox Code Playgroud)

这些给了我你的错误:

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

模块'Data.Semigroup'不导出'Semigroup(())'

  1. 也就是说,该Data.Semigroup模块存在于您的ghc
  2. Semigroup((<>)) 不属于该模块

意思是,您必须拥有最旧的ghc版本之一...

因此,我可以认为您可以尝试:

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

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

编辑1

已在ghc版本中添加8.0.1

快速搜索hoogle总是有帮助的:

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

它说:

在此处输入图片说明

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

要查看ghc的所有版本及其基本版本,请执行以下操作:

https://wiki.haskell.org/Base_package