ghc 7.6.3
对于我正在尝试编译的一些代码感到非常沮丧
错误是
No instance for (Data.String.IsString t3)
arising from the literal `"meh"'
The type variable `t3' is ambiguous
Run Code Online (Sandbox Code Playgroud)
我不明白.这是一个文字.什么是暧昧的?为什么不能把它推断为一个字符串?
这就像是一个电话
foo bar "meh"
Run Code Online (Sandbox Code Playgroud)
在哪里foo不要求第二个参数特别是任何东西(它必须满足一些typeclass,并且它对它所获得的特定组合有效.)
我会注意到我可以通过更改呼叫来修复此错误
foo bar ("meh" :: String)
Run Code Online (Sandbox Code Playgroud)
这显然是疯了.
- 编辑
也许它与overloadedStrings无关
我可以"重现"这个错误
data B a where
Foo :: a -> B A
Run Code Online (Sandbox Code Playgroud)
然后在GHCi写作简单
Foo "ok"
Run Code Online (Sandbox Code Playgroud)
(显然这失败了因为我没有得到Show,但为什么我也得到了
No instance for (Data.String.IsString a0)
arising from the literal `"ok"'
The type variable `a0' is ambiguous
...
Run Code Online (Sandbox Code Playgroud)
?这里发生了什么?这是什么意思?)
这是一个文字.什么是暧昧的?为什么不能把它推断为一个字符串?
当你使用OverloadedStrings"meh"时不是文字String.它是类型的字面多态值IsString a => a.它的类型不能被推断为String,因为它也可以作为一个懒惰的ByteString,严格的ByteString,Text等等.
foo不需要第二个参数是特别的
如果foo不要求第二个参数是什么特别的类型检查器如何知道参数foo应该是a String而不是a Text等?
我会注意到我可以通过改变
foo bar ("meh" :: String)显然是疯狂的电话来解决这个错误.
现在您告诉类型检查器您想要哪种特定类型"meh".
也许它与overloadedStrings无关
这正是与之相关的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")
Run Code Online (Sandbox Code Playgroud)
应该main打印什么?这取决于的类型"meh".用户想要什么类型的"meh"?有了OverloadedStrings,没有办法知道.