模棱两可的发生`Just'

时间:2012-07-21 03:28:54

标签: haskell emacs ghc ghci haskell-platform

我是一个绝对的初学者。使用emacs通过LYAH。

我目前的设置:

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

Point 2 described here.

找到难以遵循的指示(带来haskell库)

还需要指导才能启用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')  

1 个答案:

答案 0 :(得分:10)

您的错误只是告诉您有{em>两个可能的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模式应该足够了。