Haskell 不能';t将预期类型与推断类型匹配,刚性类型变量错误
这个函数有什么问题Haskell 不能';t将预期类型与推断类型匹配,刚性类型变量错误,haskell,Haskell,这个函数有什么问题 test :: Show s => s test = "asdasd" 字符串是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'
test :: Show s => s
test = "asdasd"
字符串是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"
test::Foo a=>a
表示“对于作为Foo
实例的任何类型,test
是该类型的值”。因此,在任何可以使用X
类型的值的地方,X
是实例Foo
,都可以使用fooa=>a
类型的值
类似于test::Num a=>a;test=42之所以有效,是因为42可以是Int
或Integer
或Float
类型的值,或者是Num
的任何其他实例
但是“asdasd”
不能是Int
或任何其他Show
的实例-它只能是字符串。因此,它与类型Show s=>s
Yes不匹配,String
是Show
的一个实例。但这不允许使用字符串作为基本Show
值1
可以是Num a=>a
,因为有1::Integer
、1::Double
、1::Word16
等。如果“asdasd”
可以是Show a=>a
类型,则会有“asdasd”::Bool
、“asdasd”::String
、、“asdasd::Int
等。没有。因此,“asdasd”
不能是Show a=>a
类型。字符串常量的类型没有比GHC中的string
更一般,GHC使用重载字符串
语言扩展名并导入数据。字符串
,您还可以使用签名测试::IsString s⇒ s
。test::Num=>a
是否与test::Num
?@mcb有任何不同,这取决于您如何定义“不同”。它们都是错误,所以在这个意义上它们是一样的。不管你怎么说,它们是不同的,因为它们可能是不同错误的结果。也就是说,test::Num=>a
可能是简单的打字错误造成的(忘记了=>
之前的a
),而test::Num
大概是代码作者认为Num
是一个类型而不是一个类型类的结果。有没有其他方法可以解决这个问题,或者用这种方法解决这个问题根本是错误的?这里是我的例子,我有类型classIDP
和函数fromString::idpa=>String->maybea
意思是将字符串转换为已知的IDP
,然后我可以像fetchValue::idpa=>maybea->IO()