Sepertinya instance Bounded harus memiliki implementasi Enum yang waras. Saya pribadi tidak bisa memikirkan contoh tandingan, meskipun jika seseorang menemukan yang tidak patologis maka saya akan mengerti mengapa ini tidak terjadi.
Dari melakukan :i
pada dua typeclasses sepertinya satu-satunya pengecualian saat ini di perpustakaan standar adalah untuk tupel, yang Dibatasi tetapi tidak Enum. Namun tuple Terikat juga harus Enumerable dengan cara yang waras, dengan hanya menambah elemen terakhir dan kemudian membungkus ketika sampai ke maxBound.
Perubahan ini mungkin juga akan melibatkan penambahan predB
dan nextB
atau sesuatu seperti itu ke Dibatasi untuk cara yang aman / berulang untuk melintasi melalui nilai-nilai Enum. Dalam hal ini toEnum 0 :: (...)
akan sama dengan(toEnum 0, toEnum 0, ...) :: (...)
Double
/Float
dan semua jenis yang samaEnum
tetap menerapkan , mereka hanya membuatsucc = (+ 1)
danfromEnum = truncate
. Cara Haskell benar-benar masuk akal dari perspektif kepraktisan sebagaimana sebaliknya [0, 0,5 ..] dan yang serupa tidak akan berhasil, sehingga tampaknya Haskell tidak khawatir tentang kemampuan berhitung ketika datang ke Enums.succ
adalah(+1)
. Itu aneh, karenaDouble
danFloat
tidak memiliki ketepatan yang tak terbatas dan karenanya dapat dihitung -succ
bisa saja didefinisikan sebagai +1 ULP .Jawaban:
Salah satu contoh praktis yang saya suka berasal dari dunia bahasa pemrograman: himpunan jenis dalam sistem OO dibatasi dan diskrit tetapi tidak dapat dihitung, dan dipesan sebagian tetapi tidak dipesan sepenuhnya.
Urutan parsial yang dimaksud adalah hubungan subtyping
<:
. Batas atas kemudian akan menjadi tipe atas (yang panggilan C #object
dan panggilan ScalaAny
), dan batas bawah akan menjadi tipe bawah (ScalaNothing
; C # / Java tidak memiliki setara dengan berbicara tentang).Namun, tidak ada cara untuk menghitung semua tipe dalam sistem tipe, jadi Anda tidak dapat menulis
instance Enum Type
. Ini harus jelas: pengguna dapat menulis tipe mereka sendiri sehingga tidak ada cara untuk mengetahui apa yang akan mereka lakukan sebelumnya. Anda dapat menghitung semua jenis dalam program apa pun, tetapi tidak di seluruh sistem.Demikian juga, (menurut definisi subtipe tertentu yang masuk akal),
<:
bersifat refleksif, transitif, dan antisimetris tetapi tidak total . Ada pasangan jenis yang tidak terkait oleh<:
. (Cat
danDog
keduanya merupakan subtipe dariAnimal
, tetapi tidak ada subtipe yang lain.)Misalkan kita sedang menulis kompiler untuk bahasa OO sederhana. Inilah representasi tipe dalam sistem kami:
Dan definisi hubungan subtyping:
Ini juga memberi kita hubungan supertyping.
Anda juga dapat menemukan batas paling atas dari dua jenis,
Latihan: menunjukkan bahwa
Type
membentuk poset lengkap yang dibatasi dua cara, di bawah<:
dan di bawah>:
.sumber
x == y = x <= y && y <= x
. Jika saya mendesain sebuahPoset
kelas, saya akan melakukannyaclass Eq a => Poset a
. Google cepat mengkonfirmasi bahwa orang lain memiliki ide yang sama .data Bound a = Min | Val a | Max
yang menambah tipea
dengan+∞
dan-∞
elemen. Dengan konstruksiBound a
selalu dapat dibuat contohBounded
tapi itu hanya akan setara jika tipe yang mendasarinyaa
adalahDouble
, di manaconst (1/0)
adalahmaxBound
danconst (negate 1/0)
adalahminBound
tetapi\x -> 1 - x
dan\x -> x - 1
tak tertandingi.Itu karena operasinya independen, jadi mengikatnya bersama dengan hubungan subkelas tidak benar-benar membelikanmu apa-apa. Katakanlah Anda ingin membuat jenis kustom yang diterapkan
Bounded
, mungkinDoubles
dibatasi antara maks dan min, tetapi Anda tidak perlu melakukanEnum
operasi apa pun . JikaBounded
subkelas, Anda harus mengimplementasikan semuaEnum
fungsi, hanya untuk membuatnya dikompilasi.Tidak masalah jika ada implementasi yang masuk akal untuk
Enum
, atau jumlah typeclasses lainnya. Jika Anda tidak benar-benar membutuhkannya, Anda tidak harus dipaksa untuk mengimplementasikannya.Bandingkan dengan katakanlah,
Ord
danEq
. Di sana,Ord
operasi tergantung padaEq
yang, jadi masuk akal untuk meminta subclass untuk menghindari duplikasi dan memastikan konsistensi.sumber
Bounded
mengatakan "Ord bukan superclass of Bounded karena tipe yang tidak sepenuhnya dipesan mungkin juga memiliki batas atas dan bawah."<:
untuk adalah subtipe dari ,∀ T S. T <: S ∨ S <: T
tidak berlaku (misalnya,int !<: bool ∧ bool !<: int
). Anda mungkin akan mengalami hal ini jika Anda sedang menulis kompiler.