我正在努力使Cell
类型成为Show
类型类的成员。 show a
行存在问题。如何确保展示位置中的a
是Char
?我希望这些陈述的顺序只是让它通过处理它,但那并没有。
data Cell = Solid | Blank | Char
instance Show (Cell) where
show Solid = "X"
show Blank = "_";
show a = [a]
main = print $ show Solid
答案 0 :(得分:3)
您无法确保a
是Char
类型的值,因为根本不是这种情况。 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,这意味着Solid
,Blank
和Char
是构造函数名称,而不是类型。例如,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
的新数据构造函数。如果您希望Cell
为Solid
,Blank
或类型为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"
确实 - Solid
是Cell
而"X"
是字符串。第二种情况也是如此。但第三种情况是什么?您将其定义为show a = [a]
,因此类型签名为Cell -> [Cell]
且[Cell]
不是String
。因此,您会遇到类型不匹配。