在Haskell中定义新数据类型时获取错误“不是数据构造函数”

时间:2017-01-15 13:57:10

标签: haskell

我正在尝试为路线定义新的数据类型。 但是,当我在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 )

请帮我弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:5)

忽略中缀数据构造函数,数据构造函数必须以大写字母开头。

data Dir = Left | Right | Up | Down

答案 1 :(得分:2)

正如@chepner正确指出的那样,数据构造函数应该以大写字母开头。要解决您遇到的下一个问题,即LeftRight在您定义的问题与Either之间存在歧义,您可以执行以下操作:

  1. 明确导入Prelude并隐藏Either类型构造函数以避免歧义。这样您就可以继续使用其他所有'默认'来自Prelude的功能没有问题

    import Prelude hiding (Either(..)) --Everything except Either which causes ambiguity issues        
    
  2. (可选)如果您希望在代码中的其他位置使用Data.Either,请执行合格导入。

    import qualified Data.Either as E --You will be able to use Either by writing E.Either in your code
    
  3. 也就是说,如果这是一个选项,你可以通过重命名数据构造函数来避免这个麻烦。