A pergunta O que há de novo em estruturas de dados puramente funcionais desde Okasaki? , e a resposta épica do jbapple, mencionada usando listas de diferenças na programação funcional (em oposição à programação lógica), algo em que recentemente me interessei. Isso me levou a encontrar a lista de diferenças implementação da para Haskell. Tenho duas perguntas (perdoe / corrija-me se eu fizer duas perguntas diferentes no StackExchange).
A questão simples é: alguém está ciente da consideração acadêmica das listas de diferenças na programação funcional e / ou implementações além da que está na biblioteca Haskell? A resposta de jbapple não citou listas de diferenças (as listas de diferenças na programação lógica existem no folclore e em algumas fontes que eu tenho por aqui em algum lugar). Antes de encontrar a implementação de Haskell, eu não sabia que a idéia havia saltado da lógica para a programação funcional. É verdade que as listas de diferenças de Haskell são uma espécie de uso natural de funções de ordem superior e funcionam de maneira bem diferente das da programação lógica, mas a interface é certamente semelhante.
A coisa mais interessante (e muito confusa) que eu queria perguntar é se o alegado limite superior assintótico para a mencionada biblioteca de listas de diferenças de Haskell parece correto / plausível. Minha confusão pode ser porque estou perdendo algo óbvio sobre o raciocínio de complexidade com preguiça, mas os limites reivindicados só fazem sentido para mim se a substituição por uma grande estrutura de dados (ou formação de fechamento, pesquisa variável ou algo ) sempre leva tempo constante. Ou é o "problema" simplesmente que não há limite no tempo de execução para "cabeça" e "cauda" precisamente porque essas operações podem ter que atravessar uma pilha arbitrária de cálculos / substituições adiadas?
fonte
Respostas:
Eu acho que isso é mais ou menos correto. As DLs realmente só têm operações de construção rápidas, portanto, o arado éΘ ( m ) m
A seguinte versão defuncionalizada de algumas das operações essenciais requer preguiça deO ( 1 )
fromList
head
tail
[a] -> [a]
toList
fonte
Sim, os limites dependem da suposição de que a composição da função leva tempo constante. Basicamente, se você tiver uma lista de associação:
fonte