我在haskell中做了一些编译器,我遇到了这个问题:
这是我目前的代码:
data Command a = Input a | Print a
readCommand:: Read a => String -> Command a
readCommand entrada
| tokens!!0 == "INPUT" = Input (tokens!!1)
| tokens!!0 == "PRINT" = Print (tokens!!1)
where
tokens = words entrada
listInstr = lines entrada
但是我收到了这个错误:
无法将类型'a'与'String'匹配; 'a'是由readC :: read a =>的类型签名绑定的刚性类型变量。字符串 - >命令
预期类型:[a];实际类型:[String]
这个错误是否意味着如果我在函数上声明我有一个字符串,那么输入'a'也不能是一个字符串吗?
感谢您的帮助
答案 0 :(得分:3)
错误意味着如果您承诺Command a
作为结果,则必须生成函数调用者请求的类型Command a
的结果(只要它满足条件{{1} }})。因此,您的类型签名允许编译以下代码:
Read a
x :: Integer
x = readCommand ""
y :: String
y = readCommand ""
z :: [Double]
z = readCommand ""
的所有这些用法都根据您的类型签名有效,因此readCommand
需要能够生成任何类型的值。您定义它的方式,无论请求哪种类型,它都将始终生成readCommand
。由于这不是您在类型中承诺的,因此会出现编译错误。
如果您希望生成Command String
s作为结果,则需要您的类型为Command String
。如果您希望您的类型与现在类型相同,则需要实际生成所请求类型的值。
请注意,您需要readCommand :: String -> Command String
,但从未真正使用Read a
功能,这需要read
。