Haskell - 无法将类型'[Char]'与'Char'匹配

时间:2017-04-27 14:22:40

标签: haskell

我刚开始学习Haskell。我必须编写一个执行以下操作的函数:

函数的定义:showCell :: Cell -> Char(已给出)

如果您致电showCell unknown,则应该回复'?',如果您致电showCell empty,则应该回复' ',如果您致电showCell full,则应该提供'#'返回showCell "unknown" = "?" showCell "empty" = " " showCell "full" = "#" 。 我写了这段代码:

Couldn't match type ‘[Char]’ with ‘Char’

但我收到type Cell = Char错误。有什么问题,你能解释一下为什么吗?

顺便说一句,Cell类型(在showCell的定义中)也被定义为:/token

1 个答案:

答案 0 :(得分:3)

"#"

Prelude> :i String type String = [Char] -- Defined in ‘GHC.Base’ 是一个字符串。这些字符串的标准Haskell类型只是字符列表

a

事物的列表与事物本身有不同的类型。当然,有些列表碰巧只包含一个元素,但很明显,当你要求一个元素时,它也不总是允许任何其他数量的元素(可能为零)!因此,Haskell总是在[a]Char之间进行类型区分。

因此,在这种情况下,您需要[Char],而不是Prelude> :t "#" "#" :: [Char] Prelude> :t '#' '#' :: Char 。这是单引号和双引号文字之间的区别:

Prelude> '#?*!^&&'

<interactive>:6:2: parse error on input ‘#?*!^&&’

当然,这意味着您不能在单引号文字中放置多个字符,这是一个错误

-> Char

...这正是应该发生的事情,因为如果函数type Cell = Char有时会将多个字符作为结果,它会违反类型签名。

这也意味着您不可能拥有"unknown",因为data Cell = Unknown | Empty | Full showCell :: Cell -> Char showCell Unknown = '?' showCell Empty = ' ' showCell Full = '#' 不是单个字符。我想你真正想要的是:

Socket clisock=new Socket("172.27.69.11",9090);
ObjectOutputStream os=new ObjectOutputStream(clisock.getOutputStream());
ObjectInputStream is=new ObjectInputStream(clisock.getInputStream());
os.writeLong(TD);
os.flush();
os.writeLong(num_Decimal);