你的错误只是告诉你有two的可能版本Just
GHCi 不知道该选择哪一个。
每个 Haskell 程序都隐式导入一大堆函数和数据类型。这些构成了“前奏”。其中一种类型是Maybe
。这意味着每个程序都可以访问与您定义的类型相同的类型,并且名称完全相同。
您可以通过两种方式克服这个问题。最好的选择是选择不同的名称:
data MyMaybe a = MyJust a | MyNothing
(我相信你能想出比这更好的名字:P。)
另一种选择是显式导入 Prelude,隐藏Maybe
:
import Prelude hiding (Maybe (..))
程序顶部的这一行只是告诉 Haskell 导入它通常导入的所有内容except Maybe
以及它的所有构造函数(Just
and Nothing
).
现在您将遇到另一个问题:GHCi 不知道如何渲染您的值Maybe
键入要在提示上显示的字符串。你会得到这样的错误:
<interactive>:1:1:
No instance for (Show (Maybe [Char]))
arising from a use of `print'
Possible fix: add an instance declaration for (Show (Maybe [Char]))
In a stmt of an interactive GHCi command: print it
你需要做的是告诉编译器如何Maybe
值看起来像一个字符串。令人高兴的是,这非常简单。事实上,它是so简单到连电脑也能做到!如果您将类型定义为:
data Maybe a = Just a | Nothing deriving (Show)
那么编译器会写一个show
函数(基本上是toString
来自其他语言)为您服务。现在你原来的陈述(Just "Haha"
)应该可以正常工作。
另外:启用 Scion 是一个完全不同的问题。我认为除非您了解了更多 Haskell 并且实际上正在从事某种更大的项目,否则不值得为此烦恼。目前,标准 Haskell 模式应该足够了。