我正在尝试为路线定义新的数据类型。 但是,当我在ghci中加载文件时,我收到错误“不是数据构造函数:left”。
以下是代码段:
data Dir = left
| right
| up
| down
instance Show Dir where
show left = "left"
show right = "right"
show up = "up"
show down = "down"
-- initialpos is assumed to be valid one
move::Pos->Dir->Pos
move prevPos left = ( (-1) $ fst prevPos , snd prevPos)
move prevPos right = ( (+1) $ fst prevPos , snd prevPos )
move prevPos up = ( fst prevPos, (+1) $ snd prevPos )
move prevPos down = ( fst prevPos, (-1) $ snd prevPos )
请帮我弄清楚出了什么问题。
答案 0 :(得分:5)
忽略中缀数据构造函数,数据构造函数必须以大写字母开头。
data Dir = Left | Right | Up | Down
答案 1 :(得分:2)
正如@chepner正确指出的那样,数据构造函数应该以大写字母开头。要解决您遇到的下一个问题,即Left
和Right
在您定义的问题与Either
之间存在歧义,您可以执行以下操作:
明确导入Prelude并隐藏Either
类型构造函数以避免歧义。这样您就可以继续使用其他所有'默认'来自Prelude
的功能没有问题
import Prelude hiding (Either(..)) --Everything except Either which causes ambiguity issues
(可选)如果您希望在代码中的其他位置使用Data.Either
,请执行合格导入。
import qualified Data.Either as E --You will be able to use Either by writing E.Either in your code
也就是说,如果这是一个选项,你可以通过重命名数据构造函数来避免这个麻烦。