不在范围内:数据构造函数'Cons'

时间:2015-12-30 16:43:28

标签: haskell

我在使用以下数据类型和功能时遇到问题:

module Lib
    (intListProd) where

data IntList = Empty
             | Cons Int IntList
  deriving Show

intListProd :: IntList -> Int
intListProd Empty = 1
intListProd (Cons x xs) = x * intListProd xs

但如果我尝试在ghci中使用它,我会收到关于' Cons'和'空'不在范围内:

*Main Lib> intListProd (Cons 3 (Cons 2 (Cons 4 Empty)))

<interactive>:19:14: Not in scope: data constructor ‘Cons’

<interactive>:19:22: Not in scope: data constructor ‘Cons’

<interactive>:19:30: Not in scope: data constructor ‘Cons’

<interactive>:19:37: Not in scope: data constructor ‘Empty’

我使用堆栈,所以我使用堆栈ghci&#39;进入外壳。

代码不是我自己的代码,我试图按照Brent Yorgey在School of Haskell Introduction to Haskell教程的第2章末尾的示例进行操作。

我注意到了#34;了解你的Haskell&#34;也使用&#39; Cons&#39; &#34;递归数据类型&#34;中的构造函数部分。是&#39;缺点&#39;应该包含在GHC中的某些东西,我出于某种原因不具备这些东西?怎么样&#39;空&#39;

2 个答案:

答案 0 :(得分:3)

module Lib
    (intListProd) where

您没有导出IntList的任何构造函数。导出它们,以便它们可供其他模块使用:

module Lib
    (intListProd, IntList(..)) where
           --     ^^^^^^^^^^^

答案 1 :(得分:1)

秘密就在GHCi提示中:

*Main Lib>

对于标有*的模块(通常只有其中一个)所有定义都在范围内,而不仅仅是从模块导出的定义。没有*的模块遵循通常的规则:只有导出的名称在GHCi中可见。