Racket yang diketik sangat berbeda dari Haskell. Sistem tipe dalam Lisp dan Skema, dan tentu saja sistem tipe dalam ekosistem bahasa tradisional yang tidak diketik pada umumnya, memiliki tujuan mendasar bahwa sistem tipe lain tidak - beroperasi dengan kode untyped yang ada . Typed Racket misalnya memperkenalkan aturan pengetikan baru untuk mengakomodasi berbagai idiom Racket. Pertimbangkan fungsi ini:
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
Untuk daftar yang tidak kosong, ini mengembalikan elemen pertama. Untuk daftar kosong, ini mengembalikan false. Ini umum dalam bahasa yang tidak diketik; bahasa yang diketik akan menggunakan beberapa jenis pembungkus suka Maybe
atau melemparkan kesalahan dalam kasing kosong. Jika kita ingin menambahkan tipe ke fungsi ini, tipe apa yang harus digunakan? Bukan [a] -> a
(dalam notasi Haskell), karena dapat mengembalikan false. Ini juga tidak [a] -> Either a Boolean
, karena (1) itu selalu mengembalikan false dalam kasus kosong, bukan boolean sewenang-wenang dan (2) jenis Entah akan membungkus elemen Left
dan salah Right
dan meminta Anda "membuka bungkus yang baik" untuk sampai ke elemen yang sebenarnya. Sebagai gantinya, nilai mengembalikan serikat yang benar- tidak ada pembungkus konstruktor, hanya mengembalikan satu jenis dalam beberapa kasus dan jenis lain dalam kasus lain. Di Typed Racket, ini diwakili dengan konstruktor tipe union:
(: first (All (A) (-> (Listof A) (U A #f))))
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
Tipe (U A #f)
menyatakan fungsi dapat mengembalikan elemen daftar atau false tanpa Either
contoh pembungkus . Pemeriksa tipe dapat menyimpulkan bahwa itu some-list
adalah salah satu dari tipe (Pair A (Listof A))
atau daftar kosong, dan selanjutnya menyimpulkan bahwa dalam dua cabang pernyataan if diketahui mana yang merupakan kasus . Pemeriksa tipe tahu bahwa dalam (car some-list)
ekspresi, daftar harus memiliki tipe (Pair A (Listof A))
karena kondisi if memastikannya. Ini disebut pengetikan kejadian dan dirancang untuk memudahkan transisi dari kode yang tidak diketik ke kode yang diketik.
Masalahnya adalah migrasi. Ada satu ton kode Racket yang tidak diketik di luar sana, dan Typed Racket tidak bisa memaksa Anda untuk meninggalkan semua pustaka untyped favorit Anda dan menghabiskan sebulan menambahkan jenis ke basis kode Anda jika Anda ingin menggunakannya. Masalah ini berlaku setiap kali Anda menambahkan tipe secara bertahap ke basis kode yang ada, lihat TypeScript dan Semua jenisnya untuk aplikasi javascript dari ide-ide ini.
Sistem tipe bertahap harus menyediakan alat untuk berurusan dengan idiom yang tidak diketik bersama dan berinteraksi dengan kode yang tidak diketik yang ada. Kalau tidak, akan sangat menyakitkan, lihat "Mengapa kita tidak lagi menggunakan Core.typed" untuk contoh Clojure.