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

时间:2014-10-18 12:47:57

标签: haskell

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
  ...

?这是怎么回事?这是什么意思?)

1 个答案:

答案 0 :(得分:5)

  

这是一个字面意思。什么是暧昧的?为什么不能把它推断为一个字符串?

当您使用OverloadedStrings时,“meh”不是文字String。它是IsString a => a类型的文字多态值。其类型不能推断为String,因为它也可以用作惰性ByteString,严格ByteStringText等。

  

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"后,无法知道。

相关问题