hago lo siguiente en GHCi:Haskell Ocurrencias ambiguas: ¿cómo evitarlo?
:m + Data.Map
let map = fromList [(1, 2)]
lookup 1 map
GHCi sabe que es un mapa (Mapa Entero Entero). Entonces, ¿por qué reclama una ambigüedad entre Prelude.lookup y Data.Map.lookup cuando el tipo es claro y puedo evitarlo?
<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
Este es el tipo de respuesta que busqué, +1. Pero me queda una pregunta. ¿Por qué, entonces, no existe una clase de tipo "contenedor" para todos estos 'Data.List',' Data.Set', etc.? O si existe (y si entiendo correctamente, esta es la clase de tipo 'Functor') - entonces, ¿por qué la definición de sus instancias para tipos de contenedor no es tan omnipresente en las bibliotecas? – ulidtko
@ulidtko: La respuesta corta es "porque es más difícil de lo que parece", y la respuesta larga no cabría en un comentario. Hay muchas complicaciones involucradas en qué contenedores admiten qué operaciones y límites en los tipos de elementos, & c. Busque información en la extensión 'TypeFamilies' - las API de contenedor son un ejemplo motivador para ello. –
@ulidtko Esto podría ser interesante para ti: http://hackage.haskell.org/packages/archive/classy-prelude/0.4.1/doc/html/ClassyPrelude.html –