Extension OverloadedString不完全推断IsString.为什么?或者我错过了什么?

goi*_*ain 5 haskell

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)

?这里发生了什么?这是什么意思?)

Tom*_*lis 5

这是一个文字.什么是暧昧的?为什么不能把它推断为一个字符串?

当你使用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,没有办法知道.