Membuktikan bahwa λ x. Ω ≠ Ω in adalah salah satu tujuan yang Abramsky tetapkan untuk teori kalkulus lambda malasnya (halaman 2 makalahnya , sudah dikutip oleh Uday Reddy), karena keduanya dalam bentuk kepala normal yang lemah. Pada definisi 2.7, ia membahas secara eksplisit bahwa eta-reduksi λ x. M x → M umumnya tidak valid, tetapi dimungkinkan jika M berakhir di setiap lingkungan. Ini tidak berarti bahwa M harus menjadi fungsi total - hanya bahwa mengevaluasi M harus diakhiri (dengan mengurangi menjadi lambda, misalnya).
Pertanyaan Anda tampaknya dimotivasi oleh masalah praktis (kinerja). Namun, meskipun Laporan Haskell mungkin kurang dari sepenuhnya jelas, saya ragu bahwa menyamakan λ x. ⊥ dengan ⊥ akan menghasilkan implementasi Haskell yang berguna; apakah itu mengimplementasikan Haskell '98 atau tidak masih bisa diperdebatkan, tetapi memberikan komentar, jelas bahwa penulis bermaksud untuk menjadi demikian.
Akhirnya, bagaimana seq menghasilkan elemen untuk tipe input yang sewenang-wenang? (Saya tahu QuickCheck mendefinisikan typeclass sewenang-wenang untuk itu, tetapi Anda tidak diizinkan untuk menambahkan kendala seperti itu di sini) Ini melanggar parametrik.
Diperbarui : Saya tidak berhasil mengkodekan hak ini (karena saya tidak begitu lancar di Haskel), dan memperbaiki ini sepertinya memerlukan runST
wilayah bersarang . Saya mencoba menggunakan sel referensi tunggal (dalam monad ST) untuk menyimpan elemen arbitrer seperti itu, membacanya nanti, dan membuatnya tersedia secara universal. Parametrisitas membuktikan bahwa di break_parametricity
bawah ini tidak dapat didefinisikan (kecuali dengan kembali ke bawah, misalnya kesalahan), sementara itu bisa memulihkan elemen yang seq diusulkan akan menghasilkan.
import Control.Monad.ST
import Data.STRef
import Data.Maybe
produce_maybe_a :: Maybe a
produce_maybe_a = runST $ do { cell <- newSTRef Nothing; (\x -> writeSTRef cell (Just x) >> return x) `seq` (readSTRef cell) }
break_parametricity :: a
break_parametricity = fromJust produce_maybe_a
Saya harus mengakui bahwa saya agak kabur memformalkan bukti parametrik yang diperlukan di sini, tetapi penggunaan parametrikitas informal ini merupakan standar di Haskell; tetapi saya belajar dari tulisan Derek Dreyer bahwa teori yang dibutuhkan dengan cepat dikerjakan dalam tahun-tahun terakhir ini.
EDIT:
- Saya bahkan tidak yakin apakah Anda memerlukan ekstensi itu, yang dipelajari untuk bahasa seperti ML, imperatif, dan tidak ketik, atau apakah teori klasik parametrik meliputi Haskell.
- Juga, saya menyebut Derek Dreyer hanya karena saya baru saja menemukan karya Uday Reddy - saya baru tahu tentang hal itu dari "Esensi Reynolds". (Saya hanya mulai benar-benar membaca literatur tentang parametrik dalam sebulan terakhir ini).