Qual ponto de correção é o tipo de lista Haskell?

9

Digamos que as listas sejam definidas como

List a = Nil | Cons a (List a)

Então, em Haskell, List xo maior ou o menos fixo? Estou perguntando porque o lfp deve excluir listas infinitas (mas você pode construí-las em Haskell), enquanto o gfp deve excluir as finitas.

miniBill
fonte

Respostas:

4

O certo é configurar

data ListF a x = Nil | Cons a x

Agora você pode escrever

newtype Mu f= Mu (forall a.(f a->a)->a)
data Nu f   = forall a. Nu a (a->f a)

Em Haskell, podemos observar isso Mu ListFe Nu ListFcoincidir. Então, pode ser (!). (uma fonte sobre essa reivindicação: http://www.cs.ox.ac.uk/jeremy.gibbons/publications/adt.pdf )

Além disso, podemos provar as coisas por indução em todas as listas e obter provas que funcionem desde que nos limitemos a cuidar de questões finitas, conforme descrito aqui: http://www.cs.ox.ac.uk/jeremy.gibbons/ publicações / fast + loose.pdf

Duas outras referências sobre isso são:

sclv
fonte
Eu acho que está faltando um x em que a declaração tipo de dados ...
miniBill
2
Há uma razão pela qual Jeremy chamou esse papel de "rápido e solto". Essa resposta é exatamente o tipo de negação de que estou falando. É o melhor ponto fixo, fim da história. O primeiro artigo vinculado de Jeremy é sobre isso, por exemplo.
Andrej Bauer
10

É o melhor ponto fixo, ou a coalgebra final, dependendo de como você define as coisas. Em Haskell, é impossível definir o tipo de dados das listas finitas, porque Haskell não possui tipos indutivos, apenas os coindutivos. Muitas pessoas estão negando esse problema em particular.

Andrej Bauer
fonte
Muitas pessoas estão em negação?
miniBill
2
Claro, conheço pessoas que tentam provar as coisas por indução em listas, árvores etc. em Haskell. Eles fingem que todos esses tipos de dados são indutivos.
Andrej Bauer
E você não pode provar as coisas por indução em listas?
miniBill
2
Você não pode provar propriedades do tipo [a]em Haskell por indução. Você pode fazer isso para um subconjunto dos valores, ou seja, as listas finitas. Mas não é isso que [a]é.
Andrej Bauer