Onde quer que eu tentei usar map
, fmap
tem funcionado bem. Por que os criadores de Haskell sentiram a necessidade de uma map
função? Não poderia ser apenas o que é conhecido atualmente fmap
e fmap
poderia ser removido da linguagem?
97
fmap
. É para mapear uma função em uma instância do Functor. Estou me perguntando sobre o propósito da especialização paramap
.Respostas:
Gostaria de dar uma resposta para chamar a atenção para o comentário de augusts :
Haskell 98 é visto como um retrocesso por alguns Haskellers (incluindo eu), versões anteriores tendo definido uma biblioteca mais abstrata e consistente. Ah bem.
fonte
map and fmap
já existe há muito tempo - foi reaquecido na lista de discussão Haskell-prime em agosto de 2006 - haskell.org/pipermail/haskell-prime/2006-August/thread.html . Como contraponto, prefiro o status quo. Para mim, parece valioso que haja um subconjunto de Haskell que corresponde aproximadamente a Miranda. No Reino Unido, Miranda foi usada como linguagem de ensino para alunos de matemática, não apenas para alunos de ciência da computação. Se esse nicho ainda não foi perdido para uma linguagem não funcional (por exemplo, Mathematica), não vejo Haskell com ummap
preenchimento unificado .Citando a
Functor
documentação em https://wiki.haskell.org/Typeclassopedia#Functorfonte
Eles têm a mesma aparência no site do aplicativo, mas são diferentes, é claro. Quando você aplica uma dessas duas funções,
map
oufmap
, a uma lista de valores, eles produzirão o mesmo resultado, mas isso não significa que tenham o mesmo propósito.Execute uma sessão GHCI (o Glasgow Haskell Compiler Interactive) para consultar informações sobre essas duas funções, então dê uma olhada em suas implementações e você descobrirá muitas diferenças.
mapa
Consulte GHCI para obter informações sobre
map
e você o verá definido como uma função de alta ordem aplicável a uma lista de valores de qualquer tipo,
a
resultando em uma lista de valores de qualquer tipob
. Embora polimórfica (oa
eb
na definição acima representam qualquer tipo), amap
função se destina a ser aplicada a uma lista de valores que é apenas um tipo de dados possível entre muitos outros em Haskell. Amap
função não pôde ser aplicada a algo que não seja uma lista de valores.Como você pode ler no código-fonte do GHC.Base , a
map
função é implementada da seguinte maneiraque faz uso da correspondência de padrões para puxar a ponta (a
x
) da cauda (axs
) da lista e, em seguida, constrói uma nova lista usando o:
construtor de valor (cons) para prefixarf x
(leia-o como "f aplicado a x" ) para a recursão demap
sobre a cauda até que a lista esteja vazia. É importante notar que a implementação damap
função não depende de nenhuma outra função, mas apenas dela mesma.fmap
Agora tente consultar informações sobre
fmap
e você verá algo bem diferente.Este tempo
fmap
é definido como uma das funções cujas implementações devem ser fornecidas por aqueles tipos de dados que desejam pertencer àFunctor
classe de tipo. Isso significa que pode haver mais de um tipo de dados, não apenas o tipo de dados "lista de valores" , capaz de fornecer uma implementação para afmap
função. Isso se tornafmap
aplicável a um conjunto muito maior de tipos de dados: os functores, de fato!Como você pode ler no código-fonte do GHC.Base , uma possível implementação da
fmap
função é aquela fornecida peloMaybe
tipo de dados:e outra implementação possível é aquela fornecida pelo tipo de dados de 2 tuplas
e outra implementação possível é aquela fornecida pelo tipo de dados de lista (claro!):
que depende da
map
função.Conclusão
A
map
função pode ser aplicada a nada mais do que lista de valores (onde os valores são de qualquer tipo) enquanto afmap
função pode ser aplicada a muito mais tipos de dados: todos aqueles que pertencem à classe do functor (por exemplo, maybes, tuplas, listas, etc. ) Uma vez que o tipo de dados "lista de valores" também é um functor (porque fornece uma implementação para ele), entãofmap
pode ser aplicado para produzir o mesmo resultado quemap
.fonte