Haskell选择性导入仅部分工作

Tob*_*bia 0 import haskell

显然,这种选择性导入仅部分起作用:

?> :m
?> import Data.Monoid (Sum, getSum)
?> :t getSum
getSum :: Sum a -> a
?> :t Sum

<interactive>:1:1: error:
    • Data constructor not in scope: Sum
    • Perhaps you meant variable ‘sum’ (imported from Prelude)
Run Code Online (Sandbox Code Playgroud)

但完全导入确实有效:

?> import Data.Monoid
?> :t Sum
Sum :: a -> Sum a
Run Code Online (Sandbox Code Playgroud)

为什么我可以从Monoid导入getSum而不是Sum?

我正在使用与Stack一起安装的GHCi 8.0.2.

bas*_*nry 5

您需要导入构造函数Sum:

?> import Data.Monoid (Sum(..), getSum)
Run Code Online (Sandbox Code Playgroud)

这将导入所有构造函数(在枚举/求和类型的情况下),如果您只想导入一个构造函数,您可以这样做:

?> import Data.Monoid (Sum(Sum), getSum)
Run Code Online (Sandbox Code Playgroud)

  • 另外,为了防止它抛出任何人,让我添加一些巧合重叠术语的消歧:a*sum类型*是一个有多个构造函数的函数,比如`data abither = left a | 对b`.碰巧,"Sum"类型不是*和类型!(这是`newtype Sum a = Sum {getSum :: a}`.) (3认同)