我的讲师为我提供了不在GHCI中构建的代码。据我所知,它已经为我的同学正确建立了。
我指的是
import Data.Semigroup (Semigroup ((<>)))
GHCI向我抛出此错误
Module ‘Data.Semigroup’ does not export ‘Semigroup((<>))’
这行得通吗?我的GHC版本可能有问题吗?所有其他导入语句都有效。
答案 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.8.3的LTS 0.7,发布于5年前 因为他们无法将其安装在64位操作系统上...
因此,可以肯定地说,我一一尝试了所有较新的LTS版本,是的...一一尝试,虽然花了一些时间但值得一试:
所有ghc版本都无法重现您的日志错误,因此我想尝试输入错误:
import Data.Semigroup (Semigroup ((<$>)))
或
import Data.Semigroup (Semigroup ((=>>)))
那些给了我你错误:
/home/damian/test-semigroup/app/Main.hs:3:24:错误:
模块“ Data.Semigroup”不导出“ Semigroup(())”
Data.Semigroup
模块已存在于您的ghc
Semigroup((<>))
不是该模块的一部分这意味着,您必须拥有最旧的ghc
版本之一...
所以,我认为您可以尝试:
我认为我的第一个答案很接近:
编辑1
已在 ghc版本8.0.1
快速搜索总是有帮助的:
Here的第一个链接是半组<>,(<>) :: Semigroup a => a -> a -> a
它说:
此版本自2016年5月起可用,ghc版本为8.0.1
。
要查看ghc的所有版本及其基本版本:
答案 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中,并且已经可以在半组上使用了。
所以,您发生的事情可能是以下情况:
Could not find module ‘Data.Semigroup’
。那是因为您正在运行旧的编译器。semigroups
软件包。相反,您安装了Semigroup
软件包,很不幸,该软件包不兼容。有两种解决方案:
semigroups
文件的build-depends
中添加.cabal
包。lts-12.14
。