模棱两可的发生`Just'

Opt*_*ght 3 emacs haskell ghc ghci haskell-platform

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

我目前的设置:

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

这里描述的第2点找到难以遵循的指令(带来haskell库).

还需要指导才能启用Scion IDE.

问题:

.hs代码

data Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)

在运行代码时,我收到以下错误:

请忽略拼写错误,原贴:

*Main> just "Haha"  
Run Code Online (Sandbox Code Playgroud)

互动>: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')  
Run Code Online (Sandbox Code Playgroud)

Tik*_*vis 10

您的错误只是告诉您有两个可能的版本,JustGHCi不知道选择哪一个.

每个Haskell程序都隐式导入一大堆函数和数据类型.这些形成了"前奏".其中一种类型是Maybe.这意味着每个程序都可以访问类似于您定义的类型,具有完全相同的名称.

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

data MyMaybe a = MyJust a | MyNothing
Run Code Online (Sandbox Code Playgroud)

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

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

import Prelude hiding (Maybe (..))
Run Code Online (Sandbox Code Playgroud)

程序顶部的这一行只是告诉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
Run Code Online (Sandbox Code Playgroud)

您需要做的是告诉编译器一个Maybe值如何看作一个字符串.令人高兴的是,这非常容易.事实上,它是那么容易,即使计算机可以做到这一点!如果您将类型定义为:

data Maybe a = Just a | Nothing deriving (Show)
Run Code Online (Sandbox Code Playgroud)

那么编译器会为你编写一个show函数(基本上toString来自其他语言).现在你的原始语句(Just "Haha")应该正常工作.

另外:启用Scion完全是一个完全不同的问题.在你学习了更多Haskell并且实际上正在开展某种更大的项目之前,我认为不值得为此烦恼.目前,标准的Haskell模式应该足够了.