我刚开始学习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
答案 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);