ประเภทแร็กเก็ตนั้นแตกต่างจาก Haskell มาก พิมพ์ระบบเสียงกระเพื่อมและโครงการและแน่นอนพิมพ์ระบบในระบบนิเวศภาษา untyped ประเพณีโดยทั่วไปมีเป้าหมายพื้นฐานที่ระบบการพิมพ์อื่น ๆ ไม่ได้ - ทำงานร่วมกันด้วยที่มีอยู่รหัส untyped แร็กเก็ตที่พิมพ์แล้วตัวอย่างเช่นแนะนำกฎการพิมพ์ใหม่ทั้งหมดเพื่อรองรับสำนวนแร็กเก็ตต่างๆ พิจารณาฟังก์ชั่นนี้:
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
สำหรับรายการที่ไม่ว่างนี่จะส่งคืนองค์ประกอบแรก สำหรับรายการที่ว่างเปล่าสิ่งนี้จะคืนค่าเท็จ นี่เป็นเรื่องธรรมดาในภาษาที่ไม่มีการพิมพ์ ภาษาที่พิมพ์จะใช้ wrapper บางชนิดเช่นMaybe
หรือโยนข้อผิดพลาดในกรณีที่ว่างเปล่า หากเราต้องการเพิ่มประเภทในฟังก์ชันนี้ควรใช้ประเภทใด มันไม่ใช่[a] -> a
(ในรูปแบบ Haskell) เพราะมันสามารถคืนค่าเท็จได้ มันยังไม่ได้[a] -> Either a Boolean
เพราะ (1) มันจะคืนค่า false ในกรณีที่ว่างเสมอไม่ใช่บูลีนที่ไม่มีกฎเกณฑ์และ (2) ทั้งสองประเภทจะล้อมรอบองค์ประกอบในLeft
และเท็จในRight
และต้องการให้คุณ แต่ค่าจะส่งกลับสหภาพที่แท้จริง- ไม่มีตัวสร้างการตัดมันจะส่งคืนหนึ่งประเภทในบางกรณีและอีกประเภทหนึ่งในกรณีอื่น ใน Typed Racket สิ่งนี้แสดงด้วยตัวสร้างประเภทร่วม:
(: first (All (A) (-> (Listof A) (U A #f))))
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
ประเภท(U A #f)
ระบุฟังก์ชั่นสามารถกลับองค์ประกอบของรายการหรือเท็จโดยไม่ต้องEither
อินสแตนซ์ห่อใด ๆ ตัวตรวจสอบชนิดสามารถอนุมานได้ว่าsome-list
เป็นชนิด(Pair A (Listof A))
หรือรายการว่างและยิ่งไปกว่านั้นมันหมายถึงว่าในสองสาขาของคำสั่ง if เป็นที่รู้จักกันว่าเป็นกรณีใด ตัวตรวจสอบชนิดรู้ว่าใน(car some-list)
นิพจน์รายการต้องมีชนิด(Pair A (Listof A))
เนื่องจากเงื่อนไข if ทำให้แน่ใจ สิ่งนี้เรียกว่าการพิมพ์ที่เกิดขึ้นและได้รับการออกแบบมาเพื่อให้ง่ายต่อการเปลี่ยนจากรหัสที่ไม่พิมพ์ไปเป็นรหัสที่พิมพ์
ปัญหาคือการโยกย้าย มีโค้ดแร็กเก็ตที่ไม่มีการพิมพ์ออกมามากมายและ Typed Racket ไม่สามารถบังคับให้คุณละทิ้งไลบรารีที่ไม่ได้พิมพ์ที่คุณชื่นชอบทั้งหมดและใช้เวลาหนึ่งเดือนในการเพิ่มประเภทให้กับโค้ดเบสของคุณหากคุณต้องการใช้ ปัญหานี้จะเกิดขึ้นทุกครั้งที่คุณเพิ่มประเภทไปยัง codebase ที่มีอยู่ค่อยๆดู TypeScript และประเภทใด ๆ สำหรับแอปพลิเคชัน javascript ของแนวคิดเหล่านี้
ระบบประเภททีละน้อยจะต้องมีเครื่องมือสำหรับการจัดการกับสำนวนที่ไม่มีการพิมพ์ทั่วไปและการโต้ตอบกับโค้ดที่ไม่มีการพิมพ์ที่มีอยู่ การใช้มันจะค่อนข้างเจ็บปวดอย่างอื่นดู"ทำไมเราไม่ใช้ Core.typed" อีกต่อไปสำหรับตัวอย่าง Clojure