我在使用以下数据类型和功能时遇到问题:
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;
答案 0 :(得分:3)
module Lib
(intListProd) where
您没有导出IntList
的任何构造函数。导出它们,以便它们可供其他模块使用:
module Lib
(intListProd, IntList(..)) where
-- ^^^^^^^^^^^
答案 1 :(得分:1)
秘密就在GHCi提示中:
*Main Lib>
对于标有*
的模块(通常只有其中一个)所有定义都在范围内,而不仅仅是从模块导出的定义。没有*
的模块遵循通常的规则:只有导出的名称在GHCi中可见。