Haskell 类实例中的Int vs Integer

Haskell 类实例中的Int vs Integer,haskell,Haskell,现在 如果我键入类似于toString 55的内容,则在提示符处显示有关不明确类型变量的错误 但是 没有 给出了什么?我找到了一个可能的解释。我认为文本的默认解释是ghci中的整数。但若那个不起作用,ghci开始困惑于他必须对文字进行Int、Double、Float……的解释。。。。 随后,他给出了关于歧义的错误。toString 55:Int命令没有给出错误,因为GHCi知道他必须将55解释为Int 您不将此方法应用于特定类型的值,而是应用于 另一个重载类型的值,即文本5。这 这意味着Hask

现在

如果我键入类似于toString 55的内容,则在提示符处显示有关不明确类型变量的错误

但是

没有

给出了什么?

我找到了一个可能的解释。我认为文本的默认解释是ghci中的整数。但若那个不起作用,ghci开始困惑于他必须对文字进行Int、Double、Float……的解释。。。。 随后,他给出了关于歧义的错误。toString 55:Int命令没有给出错误,因为GHCi知道他必须将55解释为Int

您不将此方法应用于特定类型的值,而是应用于 另一个重载类型的值,即文本5。这 这意味着Haskell必须决定选择哪种混凝土类型 在这种情况下,需要一段时间。 Haskell的类型类是开放的,通常不会随机打开 如果多个可能匹配,请选择一个。在本例中,有一个实例 对于第一个示例中的整数,或者第二个示例中的Int,但是 也可能是另一个浮动或双。哪一个是 对吗?正如我所说,哈斯克尔在这里通常是保守的 并且只是抱怨,因此您会得到不明确的类型变量错误 在第二种情况下。 然而,Haskell中有一种机制可以给出启发式,并且 这就是违约的意义所在。在正常情况下,, 对于数值类型,Haskell将在出现歧义时选择整数, 如果这不起作用,它将尝试加倍。它不尝试Int 虽然这就解释了为什么你的第一个例子是偶然的。 如果向GHCi询问类型,则不会应用默认设置,但您可以 可以观察到它在许多地方发生。比如说,

我找到了一个可能的解释。我认为文本的默认解释是ghci中的整数。但若那个不起作用,ghci开始困惑于他必须对文字进行Int、Double、Float……的解释。。。。 随后,他给出了关于歧义的错误。toString 55:Int命令没有给出错误,因为GHCi知道他必须将55解释为Int

您不将此方法应用于特定类型的值,而是应用于 另一个重载类型的值,即文本5。这 这意味着Haskell必须决定选择哪种混凝土类型 在这种情况下,需要一段时间。 Haskell的类型类是开放的,通常不会随机打开 如果多个可能匹配,请选择一个。在本例中,有一个实例 对于第一个示例中的整数,或者第二个示例中的Int,但是 也可能是另一个浮动或双。哪一个是 对吗?正如我所说,哈斯克尔在这里通常是保守的 并且只是抱怨,因此您会得到不明确的类型变量错误 在第二种情况下。 然而,Haskell中有一种机制可以给出启发式,并且 这就是违约的意义所在。在正常情况下,, 对于数值类型,Haskell将在出现歧义时选择整数, 如果这不起作用,它将尝试加倍。它不尝试Int 虽然这就解释了为什么你的第一个例子是偶然的。 如果向GHCi询问类型,则不会应用默认设置,但您可以 可以观察到它在许多地方发生。比如说,


这里发生了两件事。请记住,Haskell中的数字文字是多态的。即:

instance Visible Integer where
 toString = intToString
 size n   = length (toString n)
真的意味着

x = 55
这适用于任何你写的数字。这可能很难处理,因此GHCi实现了类型默认:如果类型不明确,它会假设裸数是整数或双精度数

当您在GHCi提示下写入字符串55时,GHCi会推断数字55的可见类型a,Num a=>a。如果作用域中只有Visible Int,则Integer的默认类型无效,因为它不满足类约束—不存在Visible Integer,因此GHCi会抱怨类型变量不明确,因为它不知道要为表达式实例化哪种类型。如果您的作用域中确实有可见的整数,则Integer的默认类型可以正常工作


如果您想使用Integer以外的类型,可以使用toString 55::Int中的显式类型,这里有两种情况。请记住,Haskell中的数字文字是多态的。即:

instance Visible Integer where
 toString = intToString
 size n   = length (toString n)
真的意味着

x = 55
这适用于任何你写的数字。这可能很难处理,因此GHCi实现了类型默认:如果类型不明确,它会假设裸数是整数或双精度数

当您在GHCi提示下写入字符串55时,GHCi会推断数字55的可见类型a,Num a=>a。如果作用域中只有Visible Int,则Integer的默认类型无效,因为它不满足类约束—不存在Visible Integer,因此GHCi会抱怨类型变量不明确,因为它不知道要为表达式实例化哪种类型。如果范围中确实有可见整数,则默认类型为 泰格工作得很好


如果要使用Integer以外的类型,可以使用toString 55::Int

FYI中的显式类型,这里是intToString的替代定义:intToString=showFYI,这里是intToString的替代定义:intToString=show
x :: Num a => a
x = fromIntegral 55