我在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 => String - > Command a of apected type:[a];的类型签名绑定 . 实际类型:[String]
这个错误是否意味着如果我在函数上声明我有一个字符串,那么输入'a'也不能是一个字符串吗?
谢谢您的帮助
1 回答
该错误意味着如果您承诺
Command a
作为结果,则必须生成函数调用者请求的类型Command a
的结果(只要它满足条件Read a
) . 所以你的类型签名允许编译以下代码:根据您的类型签名,
readCommand
的所有这些用法都是有效的,因此readCommand
需要能够生成任何类型的值 . 您定义它的方式,无论请求哪种类型,它都将始终生成Command String
. 由于这不是您在类型中承诺的,因此会出现编译错误 .如果您想生成
Command String
s作为结果,则需要您的类型为readCommand :: String -> Command String
. 如果您希望您的类型与现在类型相同,则需要实际生成所请求类型的值 .请注意,您需要
Read a
,但从未实际使用read
函数,这将需要Read a
.