这个功能出了什么问题?
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"
答案 0 :(得分:36)
test :: Foo a => a
表示“对于Foo
实例的任何类型,test
都是该类型的值”。因此,在任何可以使用X
类型的值的地方X
是实例Foo
,您可以使用Foo a => a
类型的值。
test :: Num a => a; test = 42
之类的内容有效,因为42可以是Int
或Integer
或Float
类型的值,也可以是Num
的任何其他内容。
但是"asdasd"
不能是Int
或其他任何Show
实例 - 它只能是String
。因此,它与Show s => s
类型不匹配。
答案 1 :(得分:8)
是的,String
是Show
的一个实例。但是这不允许使用字符串作为abritary Show
值。 1
可以是Num a => a
,因为有1 :: Integer
,1 :: Double
,1 :: Word16
等。如果"asdasd"
可以是{{1}类型}},会有Show a => a
,"asdasd" :: Bool
,"asdasd" :: String
等等。没有。因此,"asdasd" :: Int
不能是"asdasd"
类型。字符串常量的类型不比Show a => a
更通用。