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


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:


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.