Nah, sesuatu yang dikenal sebagai parametrik memberi tahu kita bahwa jika kita menganggap subset murni ML (yaitu, tidak ada rekursi tak terbatas, refdan semua hal aneh), tidak ada cara untuk mendefinisikan fungsi dengan tipe ini selain yang mengembalikan yang kosong daftar.
Ini semua dimulai dengan makalah Wadler “ Teorema gratis! ” Makalah ini, pada dasarnya, memberi tahu kita dua hal:
- Jika kita mempertimbangkan bahasa pemrograman yang memenuhi kondisi tertentu, kita dapat menyimpulkan beberapa teorema keren hanya dengan melihat tipe tanda tangan dari fungsi polimorfik (ini disebut Parametricity Theorem).
- ML (tanpa rekursi tak terbatas,
refdan semua hal aneh itu) memenuhi kondisi itu.
Dari Parametricity Teorema kita tahu bahwa jika kita memiliki fungsi f : 'a list -> 'b list, maka untuk semua 'a, 'b, 'c, 'ddan untuk semua fungsi g : 'a -> 'c, h : 'b -> 'dkita memiliki:
map h ∘ f = f ∘ map g
(Catatan, fdi sebelah kiri memiliki tipe 'a list -> 'b listdan fdi sebelah kanan adalah 'c list -> 'd list.)
Kita bebas memilih apa pun yang gkita suka, jadi mari 'a = 'cdan g = id. Sekarang karena map id = id(mudah dibuktikan dengan induksi pada definisi map), kami memiliki:
map h ∘ f = f
Sekarang biarkan 'b = 'd = booldan h = not. Mari kita asumsikan untuk beberapa zs : bool listhal itu terjadi f zs ≠ [] : bool list. Hal ini jelas bahwa map not ∘ f = ftidak tidak tahan, karena
(map not ∘ f) zs ≠ f zs
Jika elemen pertama dari daftar di sebelah kanan adalah true, maka di sebelah kiri elemen pertama adalah falsedan sebaliknya!
Ini artinya, anggapan kita salah dan f zs = []. Sudahkah kita selesai? Tidak.
Kami berasumsi bahwa 'badalah bool. Kami telah menunjukkan bahwa ketika fdipanggil dengan tipe f : 'a list -> bool listuntuk apa pun 'a, fharus selalu mengembalikan daftar kosong. Mungkinkah ketika kita memanggil fkarena f : 'a list -> unit listmengembalikan sesuatu yang berbeda? Intuisi kita memberi tahu kita bahwa ini omong kosong: kita tidak bisa menulis dalam ML murni suatu fungsi yang selalu mengembalikan daftar kosong ketika kita ingin memberi kita daftar boolean dan mungkin mengembalikan daftar yang tidak kosong kalau tidak! Tapi ini bukan bukti.
Apa yang ingin kita katakan adalah bahwa fadalah seragam : jika selalu mengembalikan daftar kosong untuk bool list, maka harus mengembalikan daftar kosong untuk unit listdan, secara umum, setiap 'a list. Inilah tepatnya poin kedua dalam daftar peluru di awal jawaban saya.
Makalah ini memberitahu kita bahwa di ML fharus mengambil terkait nilai-nilai ke terkait yang. Saya tidak akan merinci tentang hubungan, cukup untuk mengatakan bahwa daftar terkait jika dan hanya jika mereka memiliki panjang yang sama dan unsur-unsurnya terkait pasangan (yaitu, [x_1, x_2, ..., x_m]dan [y_1, y_2, ..., y_n]terkait jika dan hanya jika m = ndan x_1terkait dengan y_1dan x_2terkait dengan y_2dan seterusnya). Dan bagian yang menyenangkan adalah, dalam kasus kami, karena fbersifat polimorfik, kita dapat mendefinisikan hubungan apa pun pada elemen daftar!
Mari kita pilih 'a, 'bdan lihat f : 'a list -> 'b list. Sekarang lihat f : 'a list -> bool list; kami telah menunjukkan bahwa dalam hal ini fselalu mengembalikan daftar kosong. Kami sekarang mendalilkan bahwa semua elemen 'aterkait dengan diri mereka sendiri (ingat, kita dapat memilih hubungan apa pun yang kita inginkan), ini menyiratkan bahwa ada zs : 'a listyang terkait dengan dirinya sendiri. Seperti kita ketahui, fmengambil nilai terkait dengan yang terkait, ini berarti yang f zs : 'b listterkait dengan f zs : bool list, tetapi daftar kedua memiliki panjang sama dengan nol, dan karena yang pertama terkait dengan itu, juga kosong.
Untuk kelengkapan, saya akan menyebutkan bahwa ada bagian tentang dampak rekursi umum (kemungkinan non-terminasi) dalam makalah asli Wadler, dan ada juga makalah yang mengeksplorasi teorema bebas di hadapan seq.