首页 文章

couldn 't match type ' a ' with ' String'

提问于
浏览
2

我在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 回答

  • 3

    该错误意味着如果您承诺 Command a 作为结果,则必须生成函数调用者请求的类型 Command a 的结果(只要它满足条件 Read a ) . 所以你的类型签名允许编译以下代码:

    x :: Integer
    x = readCommand ""
    
    y :: String
    y = readCommand ""
    
    z :: [Double]
    z = readCommand ""
    

    根据您的类型签名, readCommand 的所有这些用法都是有效的,因此 readCommand 需要能够生成任何类型的值 . 您定义它的方式,无论请求哪种类型,它都将始终生成 Command String . 由于这不是您在类型中承诺的,因此会出现编译错误 .

    如果您想生成 Command String s作为结果,则需要您的类型为 readCommand :: String -> Command String . 如果您希望您的类型与现在类型相同,则需要实际生成所请求类型的值 .

    请注意,您需要 Read a ,但从未实际使用 read 函数,这将需要 Read a .

相关问题