gpt4 book ai didi

haskell - 扩展 OverloadedString 不能完全推断 IsString。为什么?或者我错过了什么?

转载 作者:行者123 更新时间:2023-12-03 14:07:47 25 4
gpt4 key购买 nike

全局通行证 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)

这显然是疯了。

- 编辑

也许它与重载字符串无关

我可以“重现”这个错误
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
...

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

最佳答案

it's a literal. what is ambiguous? why can't it infer this as a string?



当您使用 OverloadedStrings “meh”不是文字 String .它是类型 IsString a => a 的文字多态值.它的类型不能推断为 String因为它也可以用作懒人 ByteString , 严格 ByteString , Text , 等等..

foo doesn't require the second argument to be anything in particular



foo不需要第二个参数特别是类型检查器如何知道 foo 的参数应该是 String ,而不是 Text , 等等。?

i'll note i can fix this error by changing the call to foo bar ("meh" :: String) which is clearly insane.



现在你告诉类型检查器你想要哪种特定类型 "meh" .

maybe it has nothing to do with overloadedStrings



正是与 OverloadedStrings有关.我个人建议不要使用 OverloadedStrings只需使用 Data.String.fromString正是因为您所看到的令人困惑的行为。

i can "reproduce" this error just with ... what's going on here? what does this mean?



这是歧义的一个具体例子。
{-# 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" 的类型.用户想要什么类型的 "meh" ?与 OverloadedStrings在,没有办法知道。

关于haskell - 扩展 OverloadedString 不能完全推断 IsString。为什么?或者我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26439889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com