我是一个绝对的初学者。使用emacs通过LYAH。
我目前的设置:
还需要指导才能启用Scion IDE。
问题:
.hs代码
data Maybe a = Nothing | Just a
在运行代码时,我收到以下错误:
请忽略拼写错误,原帖:
*Main> just "Haha"
interactive>:339:1:不在范围内:`just'
这是真正的错误(在Tikhon Jelvis的评论之后添加):
*Main> Just "Haha"
interactive>:341:1:
Ambiguous occurrence `Just'
It could refer to either `Main.Just',
defined at /home/optimight/baby.hs:89:26
or `Prelude.Just',
imported from `Prelude' at /home/optimight/baby.hs:1:1
(and originally defined in `Data.Maybe')
答案 0 :(得分:10)
您的错误只是告诉您有{em>两个可能的Just
版本,GHCi不知道选择哪一个。
每个Haskell程序都隐式导入一大堆函数和数据类型。这些形成了“前奏”。其中一种类型是Maybe
。这意味着每个程序都可以访问类似于您定义的类型,具有完全相同的名称。
你可以通过两种方式克服这个问题。最好的选择是选择不同的名称:
data MyMaybe a = MyJust a | MyNothing
(我相信你可以提出比这更好的名字:P。)
另一种选择是明确导入Prelude,隐藏Maybe
:
import Prelude hiding (Maybe (..))
程序顶部的这一行只是告诉Haskell导入它正常导入的所有内容除了 Maybe
及其所有构造函数(Just
和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
值如何看作字符串。令人高兴的是,这非常容易。事实上,即使是电脑也可以轻松实现 !如果您将类型定义为:
data Maybe a = Just a | Nothing deriving (Show)
然后编译器会为您编写show
函数(基本上是toString
来自其他语言)。现在您的原始陈述(Just "Haha"
)应该正常工作。
另外:启用Scion完全是一个完全不同的问题。在你学习了更多Haskell并且实际上正在开展某种更大的项目之前,我认为不值得为此烦恼。目前,标准的Haskell模式应该足够了。