繁体   English   中英

类型类声明类型不匹配

[英]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

您不能确保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的参数类型)。

data Cell = Solid | Blank | Char

这是一个标记的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 Cell = Cell Char 

Char这里就不类型Char ; 它是一个名为Char的新数据构造函数。 如果要让CellSolidBlankChar类型的值,则需要

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"可以SolidCell"X"是字符串。 第二种情况也是如此。 但是第三种情况是什么? 您将其定义为show a = [a]因此类型签名为Cell -> [Cell]并且[Cell]不是String 因此,您会遇到类型不匹配的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM