Haskell 歧义事件——如何避免?

标签 haskell dictionary

我在 GHCI 中执行以下操作:

:m + Data.Map
let map = fromList [(1, 2)]
lookup 1 map

GHCI知道map是一个(Map Integer Integer)。那么,当类型明确且我可以避免时,为什么它会声称 Prelude.lookup 和 Data.Map.lookup 之间存在歧义?

<interactive>:1:0:
    Ambiguous occurrence `lookup'
    It could refer to either `Prelude.lookup', imported from Prelude
                          or `Data.Map.lookup', imported from Data.Map

> :t map
map :: Map Integer Integer
> :t Prelude.lookup
Prelude.lookup :: (Eq a) => a -> [(a, b)] -> Maybe b
> :t Data.Map.lookup
Data.Map.lookup :: (Ord k) => k -> Map k a -> Maybe a

最佳答案

类型明显不同,但 Haskell 不允许临时重载名称,因此您只能选择一个不带前缀的查找

典型的解决方案是导入符合条件的Data.Map:

> import qualified Data.Map as Map

那么你可以说

> lookup 1 [(1,2), (3,4)]
Just 2
> Map.lookup 1 Map.empty
Nothing

通常,Haskell 库要么避免重复使用 Prelude 中的名称,要么重复使用一大堆名称。 Data.Map 是第二个之一,作者希望您将其导入合格的。

[编辑以包含 ehemient 的评论]

如果您想使用不带前缀的Data.Map.lookup,则必须隐藏Prelude.lookup,因为否则它是隐式导入的:

import Prelude hiding (lookup) 
import Data.Map (lookup)

这有点奇怪,但如果您大量使用 Data.Map.lookup 并且您的数据结构都是映射,而不是列表,那么这可能会很有用。

关于Haskell 歧义事件——如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173628/

相关文章:

Python如何在其中也包含字符串的列表中获取数字总和

python - python 关联文件中的项目

c# - 使用 linq 填充字典

python - 如何从提供的数据递归创建字典结构?

arrays - 无法为使用 STUArray 的函数找到合适的签名(GHC 也不能)

haskell - 安装不在 stackage 上但在 hackage 上的包

haskell - 为什么这个缩进是错误的?

python - 如何将数据框转换为字典

haskell - 有什么方法可以先在 Haddock 中描述函数参数?

haskell - 将 haskell 点列表转换为可以使用 splot 调用的文件