无法将类型'a'与'String'匹配

时间:2016-03-30 11:02:37

标签: haskell

我在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'也不能是一个字符串吗?

感谢您的帮助

1 个答案:

答案 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