暧昧发生'只是”( Ambiguous occurrence `Just' )

2019-09-19 23:46发布

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

我目前的设置:

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

发现很难按照说明在(带哈斯克尔库) 这里介绍点2。

另外还需要指导,使接穗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')  

Answer 1:

你的错误只是告诉你,有两种可能的版本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" )应能正常工作。

也:使接穗完全是一个完全不同的问题。 我不认为这是值得它困扰,直到你学会了更多Haskell和实际从事某种更大的项目。 目前,该标准哈斯克尔模式应该是绰绰有余。



文章来源: Ambiguous occurrence `Just'