我在 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/