Yazılan Raket Haskell'den çok farklıdır. Lisp ve Scheme'deki tür sistemleri ve genel olarak geleneksel olarak türlenmemiş dil ekosistemlerindeki tür sistemleri, diğer tür sistemlerin varolan türlenmemiş kodla birlikte çalışmadığı temel bir amaca sahiptir . Örneğin Yazılı Raket, çeşitli Raket deyimlerini barındırmak için tamamen yeni yazım kuralları getirmiştir. Bu işlevi göz önünde bulundurun:
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
Boş olmayan listelerde bu, ilk öğeyi döndürür. Boş listelerde bu false değerini döndürür. Bu türlenmemiş dillerde yaygındır; yazılan bir dil Maybe
, boş kutu gibi bir sarmalayıcı türü kullanır veya hata verir. Bu işleve bir tür eklemek istersek, hangi tür kullanılmalıdır? O değil [a] -> a
o return false, çünkü (Haskell gösterimde). Ayrıca [a] -> Either a Boolean
, (1) boş durumda her zaman false döndürür, keyfi bir boole değil ve (2) Her iki tür de öğeleri içeri Left
ve yanlış Right
sarır ve gerçek öğeye ulaşmak için "ikisinden birini açmanızı" gerektirir. Bunun yerine, değeri döndürür gerçek birliği- ambalaj yapıcıları yoktur, bazı durumlarda sadece bir türü, diğer durumlarda başka bir türü döndürür. Yazılan Rakette, bu birleşim tipi yapıcı ile temsil edilir:
(: first (All (A) (-> (Listof A) (U A #f))))
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
Tür (U A #f)
, işlevin herhangi bir kaydırma Either
örneği olmadan listenin bir öğesini veya false değerini döndürebileceğini belirtir . Tür denetleyicisi, some-list
tür (Pair A (Listof A))
veya boş listeden çıkarım yapabilir ve ayrıca if ifadesinin iki dalında bunlardan hangisinin durumun bilindiğini ihlal eder . Tür denetleyicisi (car some-list)
ifadede listenin türün olması gerektiğini bilir, (Pair A (Listof A))
çünkü if koşulu bunu sağlar. Buna oluşum yazma denir ve türlenmemiş koddan yazılan koda geçişi kolaylaştırmak için tasarlanmıştır.
Sorun göç. Orada bir ton türlenmemiş Raket kodu var ve Yazılan Raket, tüm favori türetilmemiş kütüphanelerinizden vazgeçmenize ve kullanmak istiyorsanız kod tabanınıza bir ay ekleyerek sizi zorlayamaz. Bu sorun , varolan bir kod tabanına türler yavaş yavaş eklediğinizde geçerlidir , bu fikirlerin javascript uygulaması için bkz. TypeScript ve Her Tür.
Aşamalı bir tür sistemi, ortak türlenmemiş deyimlerle başa çıkmak ve mevcut türsüz kodla etkileşim kurmak için araçlar sağlamalıdır. Aksi takdirde kullanmak oldukça acı verici olacaktır, Clojure örneği için "Neden artık Core.typed kullanmıyoruz" konusuna bakın .