2012-07-21 31 views
3

我是一个绝对的初学者。使用emacs浏览LYAH。模糊发生`只是'

我现在的建立:

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

发现难以遵循指令(带来haskell库)在Point 2 described here.

还需要指导启用Scion IDE

问题:

开发文件代码

data Maybe a = Nothing | Just a 

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

请忽略错字的错误,原帖:

*Main> just "Haha" 

互动>:339:1:不在范围内:`只是'

这是真正的错误(吉洪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

**婴儿步骤** - 哈哈哈,我第一次看到一个诚实的要求喂勺子。凉。 :) – Nishant 2012-07-21 03:32:36

+0

呃,'刚刚'必须以大写字母开头。所以你应该写'Just'哈哈''。这是一个错误的错误或你实际输入GHCi? – 2012-07-21 04:03:09

回答

10

你的错误只是告诉你,有2个Just可能的版本和GHCI不知道哪一个挑。

每个Haskell程序都隐含地导入一大堆函数和数据类型。这些形成了“序幕”。其中一种是Maybe。这意味着每个程序都可以访问类似于您定义的类型的名称。

您可以通过两种方式克服这一点。最好的办法是只选择不同的名称:

data MyMaybe a = MyJust a | MyNothing 

(我相信你能拿出一个比这更好的,虽然名字:P)

的另一个选项是导入的前奏明确地说,隐藏Maybe

import Prelude hiding (Maybe (..)) 

这条线在你的程序的顶部只是告诉哈斯克尔进口一切它通常进口除了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模式应该足够了。

+0

先生,我谦卑的要求添加一个选项:我的错误是,我宣布'数据可能'已经宣布,并在前奏。人们可以选择 - 不是直接声明,而是直接测试'Just'哈哈''。 – Optimight 2012-07-21 06:05:25

+0

当我运行'数据MyMaybe a = MyJust a | MyNothin'它编译得很好。当我然后运行'MyJust'空白''我得到一个错误“没有实例(显示...”我可以理解为什么我会得到这个错误,但是学习你一个Haskell显示了一种不同于错误的行为,你能解释一下为什么吗? – Addem 2017-02-24 05:32:42

+0

我不知道LYAH对这个问题所表现出来的问题,因为'MyMaybe'没有'Show'实例:你可以手动实现一个或添加一个'deriving Show'子句到数据定义。 – 2017-02-25 10:23:51