Fixpoint mana yang merupakan tipe daftar Haskell?

9

Katakanlah bahwa daftar didefinisikan sebagai

List a = Nil | Cons a (List a)

Lalu, di Haskell adalah List xfixpoint terbesar atau paling tidak? Saya bertanya karena lfp harus mengecualikan daftar yang tidak terbatas (tetapi Anda dapat membangunnya di Haskell), sedangkan gfp harus mengecualikan daftar yang terbatas.

miniBill
sumber

Jawaban:

4

Yang tepat adalah pengaturan

data ListF a x = Nil | Cons a x

Sekarang kamu bisa menulis

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

Di Haskell kita bisa mengamati itu Mu ListFdan Nu ListFbertepatan. Jadi, bisa berupa (!). (satu sumber pada klaim ini: http://www.cs.ox.ac.uk/jeremy.gibbons/publications/adt.pdf )

Selain itu, kami dapat membuktikan hal-hal dengan menginduksi pada semua daftar dan mendapatkan bukti yang berfungsi selama kami membatasi diri untuk mengurus yang terbatas, seperti dijelaskan di sini: http://www.cs.ox.ac.uk/jeremy.gibbons/ publikasi / cepat + lepas.pdf

Dua referensi lain tentang ini adalah:

sclv
sumber
Saya pikir Anda kehilangan x dalam deklarasi datatype itu ...
miniBill
2
Ada alasan Jeremy menyebut kertas itu "cepat & longgar". Jawaban ini persis seperti penolakan yang saya bicarakan. Ini adalah titik tetap terbesar, akhir cerita. Makalah pertama yang dikaitkan Jeremy adalah tentang itu, misalnya.
Andrej Bauer
10

Ini adalah titik tetap terbesar, atau bilangan bulat batubara terakhir, tergantung pada bagaimana Anda mengatur segalanya. Dalam Haskell tidak mungkin untuk menentukan tipe data dari daftar hingga karena Haskell tidak memiliki tipe induktif, hanya tipe coinductive. Banyak orang yang menyangkal masalah khusus ini.

Andrej Bauer
sumber
Banyak orang yang menyangkal?
miniBill
2
Tentu, saya bertemu orang-orang yang mencoba membuktikan sesuatu dengan memasukkan daftar, pohon, dll di Haskell. Mereka menganggap semua tipe data ini induktif.
Andrej Bauer
Dan Anda tidak dapat membuktikan hal-hal dengan induksi pada daftar?
miniBill
2
Anda tidak dapat membuktikan properti tipe [a]di Haskell dengan induksi. Anda dapat melakukannya untuk subset nilai, yaitu daftar hingga. Tapi ini bukan apa yang [a]ada.
Andrej Bauer