我是一个绝对的初学者。 通过LYAH使用emacs去。
我目前的设置:
- Ubuntu的LTS 12.04(使用体验 - 初学者)
- GNU Emacs的23(使用体验 - 初学者)
发现很难按照说明在(带哈斯克尔库) 这里介绍点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')
你的错误只是告诉你,有两种可能的版本Just
和GHCI不知道哪一个选择。
每一个Haskell程序隐含进口一大堆的功能和数据类型。 这些构成了“前奏”。 这些类型之一是Maybe
。 这意味着,每一个程序已经访问了就像你定义的,完全相同的名称的一个类型。
您可以通过两种方式解决这个。 最好的办法是只选择不同的名称:
data MyMaybe a = MyJust a | MyNothing
(我相信你能拿出一个比这更好的,虽然名字:P)
另一种选择是明确导入前奏,躲在Maybe
:
import Prelude hiding (Maybe (..))
这条线在你的程序的顶部只是告诉哈斯克尔进口一切它通常进口,除非 Maybe
和它的所有构造函数( Just
和Nothing
)。
现在,你会遇到更多的一个问题: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和实际从事某种更大的项目。 目前,该标准哈斯克尔模式应该是绰绰有余。