gpt4 book ai didi

haskell - 带有 HashMap 的二义性类型变量

转载 作者:行者123 更新时间:2023-12-03 09:45:54 25 4
gpt4 key购买 nike

我最近开始使用 haskell 并且在使用 HashMap 时遇到了一个问题,可以通过这个玩具示例来说明:

import Data.HashMap as HashMap

foo = HashMap.insert 42 53 HashMap.empty

这是我在解释器中加载我的文件或编译它时得到的错误:
Prelude List HashMap> :load TypeError.hs
[1 of 1] Compiling Main ( TypeError.hs, interpreted )

TypeError.hs:3:22:
Ambiguous type variable `k0' in the constraints:
(Num k0) arising from the literal `42' at TypeError.hs:3:22-23
(Ord k0) arising from a use of `insert' at TypeError.hs:3:7-20
(Data.Hashable.Hashable k0)
arising from a use of `insert' at TypeError.hs:3:7-20
Possible cause: the monomorphism restriction applied to the following:
foo :: Map k0 Integer (bound at TypeError.hs:3:1)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
In the first argument of `insert', namely `42'
In the expression: insert 42 53 empty
In an equation for `foo': foo = insert 42 53 empty
Failed, modules loaded: none.
Prelude List HashMap>

但是,如果我直接在解释器中定义完全相同的函数,则不会出现错误:
Prelude List HashMap> let foo = HashMap.insert 42 53 HashMap.empty
Prelude List HashMap>

有没有人对此有任何线索?

谢谢。

最佳答案

原因是 ghci 使用扩展的默认规则,而编译器使用(默认)defaulting rules specified in the language report :

类 Num 中的歧义是最常见的,因此 Haskell 提供了另一种解决它们的方法——使用默认声明:default (t1 , … , tn) 其中 n ≥ 0,并且每个 ti 必须是 Num ti 所持有的类型。在发现歧义类型的情况下,歧义类型变量 v 在以下情况下是可缺省的:

  • v 仅出现在 C v 形式的约束中,其中 C 是一个类,并且
  • 这些类中至少有一个是数字类(即 Num 或 Num 的子类),以及
  • 所有这些类都在 Prelude 或标准库中定义


  • 相关规则是,根据报告,仅当所有涉及的类都在标准库中定义时才进行默认设置,但 Hashable键上的约束涉及不满足该要求的类。

    因此编译器拒绝它,因为它无法解析由 key 产生的歧义类型变量,而 ghci 默认它是 Integer ,因为如果涉及其他类,ghci 也会默认。

    关于haskell - 带有 HashMap 的二义性类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13752014/

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