Haskell 歧义出现“Just';
我是个十足的初学者。使用emacs通过LYAH 我当前的设置: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:不在范围
- Ubuntu 12.04 LTS(使用体验-初学者)
- GNU Emacs 23(使用经验-初学者)
- 能够在haskell专业模式下工作
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)