ghc 7.6.3
对于我试图编译的一些代码感到非常沮丧
错误是
No instance for (Data.String.IsString t3)
arising from the literal `"meh"'
The type variable `t3' is ambiguous
我不明白。这是一个字面意思。什么是暧昧的?为什么不能将其推断为字符串?
这是一个像
这样的电话foo bar "meh"
其中foo
并不要求第二个参数是特定的(它必须满足某些typeclass
,并且它适用于它所获得的特定组合。)
我注意到我可以通过更改对
的调用来解决此错误foo bar ("meh" :: String)
这显然是疯了。
- 编辑
也许它与overloadedStrings
无关我可以"重现"这个错误只是
data B a where
Foo :: a -> B A
然后在GHCi写作
Foo "ok"
(显然这是失败的,因为我没有得出Show
,但为什么我也得到
No instance for (Data.String.IsString a0)
arising from the literal `"ok"'
The type variable `a0' is ambiguous
...
?这是怎么回事?这是什么意思?)
答案 0 :(得分:5)
这是一个字面意思。什么是暧昧的?为什么不能把它推断为一个字符串?
当您使用OverloadedStrings
时,“meh”不是文字String
。它是IsString a => a
类型的文字多态值。其类型不能推断为String
,因为它也可以用作惰性ByteString
,严格ByteString
,Text
等。
foo
不要求第二个参数特别是
如果foo
不需要第二个参数,那么类型检查器如何知道foo
的参数应该是String
,而不是{{1等等?
我会注意到我可以通过将呼叫更改为
Text
来解决此错误,这显然是疯了。
现在,您要告诉类型检查器您需要哪种特定类型foo bar ("meh" :: String)
。
也许它与overloadedStrings
无关
与<{1}}完全相同。我个人建议不要使用"meh"
而只是正好使用OverloadedStrings
,因为您看到了令人困惑的行为。
我可以“重现”这个错误,只是......这里发生了什么?这是什么意思?
这是歧义的一个具体例子。
OverloadedStrings
Data.String.fromString
应该打印什么?这取决于{-# LANGUAGE OverloadedStrings, FlexibleInstances #-}
import Data.Text
class Foo a where
foo :: a -> String
instance Foo String where
foo _ = "String"
instance Foo Text where
foo _ = "Text"
main :: IO ()
main = print (foo "meh")
的类型。用户想要main
的类型是什么?启用"meh"
后,无法知道。