[英]Typeclass declaration type mismatch
我试图使我的Cell
类型成为Show
typeclass的成员。 show a
线有问题。 在该展示柜中,如何确定a
是一个Char
? 我希望语句的顺序只会让fallthrough处理它,但是那没有做到。
data Cell = Solid | Blank | Char
instance Show (Cell) where
show Solid = "X"
show Blank = "_";
show a = [a]
main = print $ show Solid
您不能确保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
的参数类型)。
data Cell = Solid | Blank | Char
这是一个标记的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 Cell = Cell Char
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"
查看type类Show
的定义,主要是show
函数:
class Show a where
show :: a -> String
现在,您对Cell
类型的实例满足吗? 第一种情况, show Solid = "X"
可以Solid
是Cell
, "X"
是字符串。 第二种情况也是如此。 但是第三种情况是什么? 您将其定义为show a = [a]
因此类型签名为Cell -> [Cell]
并且[Cell]
不是String
。 因此,您会遇到类型不匹配的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.