类型类声明类型不匹配

时间:2016-04-30 20:27:51

标签: haskell

我正在努力使Cell类型成为Show类型类的成员。 show a行存在问题。如何确保展示位置中的aChar?我希望这些陈述的顺序只是让它通过处理它,但那并没有。

data Cell = Solid | Blank | Char

instance Show (Cell) where
    show Solid = "X"
    show Blank  = "_";
    show a = [a]

main = print $ show Solid

4 个答案:

答案 0 :(得分:3)

您无法确保aChar类型的值,因为根本不是这种情况。 a永远是Cell类型的值,具体来说它是值Char(与Char类型无关。)

您似乎想要的是让Cell的第三个构造函数包含类型Char的值。为此,构造函数需要一个参数:

data Cell = Solid | Blank | CharCell Char

instance Show (Cell) where
    show Solid = "X"
    show Blank  = "_"
    show (CharCell a) = [a]

如果使用了构造函数CharCell a并且CharCell将是用作a的参数的值(CharCell的类型Char,则CharCell大小写匹配因为那是bridge name bridge id STP enabled interfaces testbr 8000.000000000000 no vlan.2 8000.b827eb33bfd5 no eth0.2 veth689NIN 的参数类型)。

答案 1 :(得分:2)

data Cell = Solid | Blank | Char

这是tagged union,这意味着SolidBlankChar是构造函数名称,而不是类型。例如,Char :: Cell

我怀疑你的意思是这样的:

data CellType = CellConstructor Char

instance Show CellType where
  show (CellConstructor c) = [c]

示例:

  • CellConstructor 'X' :: CellType
  • CellConstructor '_' :: CellType
  • CellConstructor 'a' :: CellType

如果只有一个构造函数,习惯上给类型和构造函数指定相同的名称。

data Cell = Cell Char

如果只有一个构造函数只有一个字段,那么习惯使用newtype。

newtype Cell = Cell Char 

答案 2 :(得分:1)

Char此处不是Char类型;它是一个名为Char的新数据构造函数。如果您希望CellSolidBlank或类型为Char,则需要

data Cell = Solid | Blank | Char Char

instance Show Cel where
    show Solid = "X"
    show Blank = "_"
    show (Char c) = [c]

一些例子:

> show Solid
"X"
> show Blank
"_"
> show (Char '4')
"4"

答案 3 :(得分:0)

查看类型类Show的定义,主要是show函数:

class Show a where
    show      :: a   -> String

现在,您的Cell类型的实例是否满足它?第一种情况show Solid = "X"确实 - SolidCell"X"是字符串。第二种情况也是如此。但第三种情况是什么?您将其定义为show a = [a],因此类型签名为Cell -> [Cell][Cell]不是String。因此,您会遇到类型不匹配。