3

我是一个绝对的初学者。使用 emacs 浏览 LYAH。

我目前的设置:

  • Ubuntu 12.04 LTS(使用体验-初学者)
  • GNU Emacs 23(使用体验-初学者)
    • 能够在haskell专业模式下工作

发现难以遵循此处描述的第 2 点的说明(带上 haskell 库)。

还需要指导以启用Scion IDE

问题:

.hs 代码

data Maybe a = Nothing | Just a

运行代码时,出现以下错误:

请忽略拼写错误,原贴:

*Main> just "Haha"  

交互>:339:1:不在范围内:“只是”

这是真正的错误(在 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')  
4

1 回答 1

11

您的错误只是告诉您有两种可能的版本,Just而 GHCi 不知道该选择哪一个。

每个 Haskell 程序都会隐式导入一大堆函数和数据类型。这些构成了“前奏”。其中一种类型是Maybe. 这意味着每个程序都已经可以访问一种类型,就像您定义的类型一样,具有完全相同的名称。

你可以通过两种方式克服这个问题。最好的选择是只选择不同的名称:

data MyMaybe a = MyJust a | MyNothing

(我相信你可以想出比这更好的名字:P。)

另一种选择是显式导入 Prelude,隐藏Maybe

import Prelude hiding (Maybe (..))

程序顶部的这一行只是告诉 Haskell 导入它通常导入的所有内容,除了 Maybe它的所有构造函数(JustNothing)。

现在您将遇到另一个问题: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 模式应该绰绰有余。

于 2012-07-21T04:25:03.120 回答