Haskell 歧义出现“Just';

Haskell 歧义出现“Just';,haskell,emacs,ghc,ghci,haskell-platform,Haskell,Emacs,Ghc,Ghci,Haskell Platform,我是个十足的初学者。使用emacs通过LYAH 我当前的设置: Ubuntu 12.04 LTS(使用体验-初学者) GNU Emacs 23(使用经验-初学者) 能够在haskell专业模式下工作 发现在以下位置难以遵循说明(带haskell库) 还需要指导才能实现 问题: .hs代码 data Maybe a = Nothing | Just a 运行代码时,出现以下错误: 请忽略最初发布的打字错误: *Main> just "Haha" 交互式>:339:1:不在范围

我是个十足的初学者。使用emacs通过LYAH

我当前的设置:

  • Ubuntu 12.04 LTS(使用体验-初学者)
  • GNU Emacs 23(使用经验-初学者)
    • 能够在haskell专业模式下工作
发现在以下位置难以遵循说明(带haskell库)

还需要指导才能实现

问题:

.hs代码

data Maybe a = Nothing | Just a
运行代码时,出现以下错误:

请忽略最初发布的打字错误:

*Main> just "Haha"  
交互式>:339:1:不在范围内:'just'

这是真正的错误(在Tikhon Jelvis的评论后添加):


您的错误只是告诉您有两个版本的
just
,GHCi不知道选择哪个版本

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

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

data MyMaybe a = MyJust a | MyNothing
(不过我相信你能想出更好的名字:p。)

另一个选项是显式导入前奏,隐藏
可能

import Prelude hiding (Maybe (..))
程序顶部的这一行只是告诉Haskell导入它通常导入的所有内容,除了
可能
及其所有构造函数(
只是

现在,您将遇到另一个问题: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
然后编译器将为您编写一个
show
函数(基本上是从其他语言编写的
toString
)。现在,您的原始语句(
只是“哈哈”
)应该可以正常工作了


另外:启用Scion是一个完全不同的问题。我认为在你了解了更多Haskell并正在从事某个更大的项目之前,不值得为此烦恼。现在,标准的Haskell模式应该已经足够了。

婴儿步——哈哈哈,我第一次看到一个诚实的用勺子喂食的请求。酷。:)呃,
必须以大写字母开头。所以你应该只写“哈哈”
。这是问题中的一个输入错误,还是您在GHCi中实际输入的内容?先生,我谦虚地要求再添加一个选项:我的错误是我声明了“数据可能是a”,这是已经声明并作为序曲出现的。你可以选择-不显式声明它,而是直接测试'Just“Haha'。当我运行
数据mya=MyJust a | MyNothin
时,它编译得很好。然后,当我运行
MyJust“blank”
时,我得到一个错误“No Instance for(Show…”我可以理解为什么我会出现这个错误,但是我知道Haskell显示了与错误不同的行为,你能解释为什么吗?我不知道LYAH对此问题显示了什么。出现这个问题的原因是,
MyMaybe
没有一个
Show
实例:你可以手动实现一个或添加一个
deriving在数据定义中显示
子句。
<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
data Maybe a = Just a | Nothing deriving (Show)