无法将预期类型与推断类型匹配,刚性类型可变错误

时间:2011-01-07 20:19:57

标签: haskell

这个功能出了什么问题?

test :: Show s => s
test = "asdasd"

String是Show类的一个实例,所以看起来是正确的。

错误是

src\Main.hs:224:7:
    Couldn't match expected type `s' against inferred type `[Char]'
      `s' is a rigid type variable bound by
          the type signature for `test' at src\Main.hs:223:13
    In the expression: "asdasd"
    In the definition of `test': test = "asdasd"

2 个答案:

答案 0 :(得分:36)

test :: Foo a => a表示“对于Foo实例的任何类型,test都是该类型的值”。因此,在任何可以使用X类型的值的地方X是实例Foo,您可以使用Foo a => a类型的值。

test :: Num a => a; test = 42之类的内容有效,因为42可以是IntIntegerFloat类型的值,也可以是Num的任何其他内容。

但是"asdasd"不能是Int或其他任何Show实例 - 它只能是String。因此,它与Show s => s类型不匹配。

答案 1 :(得分:8)

是的,StringShow的一个实例。但是这不允许使用字符串作为abritary Show值。 1可以是Num a => a,因为有1 :: Integer1 :: Double1 :: Word16等。如果"asdasd"可以是{{1}类型}},会有Show a => a"asdasd" :: Bool"asdasd" :: String等等。没有。因此,"asdasd" :: Int不能是"asdasd"类型。字符串常量的类型不比Show a => a更通用。