Pergunta

Em Python mapa () funciona em quaisquer dados que segue o protocolo de sequência. Ele faz a coisa certa ^ TM se eu alimentá-lo uma corda ou uma lista ou até mesmo uma tupla.

Não posso ter o meu bolo em OCaml também? Eu realmente não têm outra escolha a não ser olhar para a coleção tipo que estou usando e encontrar um List.map correspondente ou um Array.map ou um Buffer.map ou um String.map? Alguns deles nem sequer existem! É o que eu estou pedindo incomum? Eu devo estar faltando alguma coisa.

Foi útil?

Solução

O mais próximo que você vai chegar a este é o módulo Enum em OCaml baterias incluídas (anteriormente de Extlib ). define Enum mapas e dobras sobre Enum.t; você apenas tem que usar uma conversão de / para Enum.t para o seu tipo de dados. As conversões podem ser bastante leve, porque Enum.t é preguiçoso.

O que você realmente quer é Haskell-style classes tipo , como Foldable e Functor (que generaliza "mapeia"). As bibliotecas Haskell definir instâncias de Foldable e Functor para listas, matrizes e árvores. Outra técnica importante é a "Scrap Seu Boilerplate" abordagem para programação genérica. Desde OCaml não suporta classes tipo ou de maior kinded polimorfismo , eu não acho que você seria capaz de expressar padrões como estes em seu sistema tipo.

Outras dicas

Existem duas soluções principais em OCaml:

  1. Jacques Garrigue já implementada uma abordagem sintaticamente-luz, mas ineficiente para muitas estruturas de dados há vários anos. Você só embrulhar as coleções em objetos que proporcionam um método map. Então você pode fazer collection#map de usar a função de mapa para qualquer tipo de coleção. Esta é mais geral do que suas necessidades, pois permite que diferentes tipos de estruturas de dados a ser substituído em tempo de execução . No entanto, isso não é muito útil na prática assim que a abordagem não foi amplamente adotado.

  2. A sintaticamente-mais pesado, mas solução eficiente, robusto e estática é usar functors para parametrizar o seu código sobre a estrutura de dados que você está usando. Isso torna trivial para reutilizar o seu código com diferentes estruturas de dados. Ver traduções OCaml de Markus Mottl do livro de Okasaki "Estruturas de Dados puramente funcional" para alguns grandes exemplos.

Se você não está procurando esse tipo de poder e só quer brevidade então, é claro, você pode simplesmente criar um alias de módulo com um nome mais curto (por exemplo, módulo S = String).

O problema é que cada recipiente tem uma representação diferente e requer código diferente por mapa / reduzir a iterate sobre ele. É por isso que existem funções distintas. A maioria das linguagens fornecer algum tipo de interface geral para recipientes (como o protocolo seqüência que você mencionou) para funções como map / reduce podem ser implementadas de forma abstrata, mas isso não é feito para os tipos que você mencionou.

Enquanto você definir um tipo de t e Val comparar (: t-> T-> int) no seu módulo, Map.Make lhe dará o mapa que você deseja.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top