Map
es un tipo de datos parametrizado (también llamado abstract data type). Solo cuando especifica un tipo para las claves y un tipo para los valores obtiene un tipo completamente definido.
Por ejemplo, un mapa que le permite buscar String
s por Integer
s tiene el tipo Map Integer String
.
Además, parece que importó Map calificado (como debería). Debido a esto, debe usar Map.Map
en lugar de solo Map
en la firma.
lo tanto, su función debe tener una firma como
serialExpansion :: Int -> Map.Map Key Value
donde Key
es el tipo de datos clave y Value
es el tipo de datos de valor. En su caso, si tuviera que adivinar, tal vez desee Int
para ambos Key
y Value
. Para ser precisos: quiere que Key
sea el mismo que el tipo de los elementos en la lista listOfSimpleDividers num
, y Value
sea el mismo que el tipo de los elementos en la lista powers num
. (Puede ser útil inspeccionar la firma de tipo Map.fromList
si no está claro).
Por ahora puede que se pregunte: "pero si pudo decir el tipo de devolución correcto de serialExpansion
, ¿por qué no puede el compilador?" Puede. Es exactamente por eso que funcionó tu primer ejemplo. Como omitió la firma de tipo, el compilador la dedujo del contexto. Como acaba de experimentar, escribir firmas de tipo puede ser una buena forma de asegurarse de comprender completamente su código (en lugar de confiar en la inferencia de tipo).
¡El último párrafo es el punto clave! +1 – fuz
Tipo de datos parametrizados (también llamado tipo de datos abstractos): "parametrizado" y "abstracto" no son lo mismo. Son conceptos independientes: un tipo de datos puede ser uno o ambos. – timbod