ฉันกำลังพยายามทำให้ประเภท ghci แสดงสำหรับไลบรารีของฉันให้ใช้งานง่ายที่สุด แต่ฉันพบปัญหามากมายเมื่อใช้คุณสมบัติประเภทขั้นสูงเพิ่มเติม
สมมติว่าฉันมีรหัสนี้ในไฟล์:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Container (xs::[*]) = Container
ฉันโหลดเป็น ghci จากนั้นพิมพ์คำสั่งต่อไปนี้:
ghci> :t undefined :: Container '[String,String,String,String,String]
น่าเสียดายที่ ghci ทำให้ฉันดูค่อนข้างน่าเกลียด:
:: Container
((':)
*
String
((':)
* String ((':) * String ((':) * String ((':) * String ('[] *))))))
ghci ได้ลบน้ำตาลสำหรับสตริงระดับประเภท มีวิธีใดบ้างที่จะป้องกันไม่ให้ ghci ทำสิ่งนี้และให้ฉันเป็นเวอร์ชั่นที่น่ารัก?
ในบันทึกที่เกี่ยวข้องสมมติว่าฉันสร้างReplicate
ฟังก์ชันระดับประเภท
data Nat1 = Zero | Succ Nat1
type family Replicate (n::Nat1) x :: [*]
type instance Replicate Zero x = '[]
type instance Replicate (Succ n) x = x ': (Replicate n x)
type LotsOfStrings = Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String
ตอนนี้เมื่อฉันถาม ghci สำหรับประเภทโดยใช้LotsOfStrings
:
ghci> :t undefined :: Container LotsOfStrings
ghci ดีและให้ผลลัพธ์ที่สวยงาม:
undefined :: Container LotsOfStrings
แต่ถ้าฉันขอReplicate
รุ่น d
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
ghci แทนที่ในตระกูล type เมื่อไม่ได้ทำเช่นนั้นสำหรับคำพ้องประเภท:
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
เหตุใด ghci จึงทำการแทนที่ type family แต่ไม่ใช่ type synonym มีวิธีควบคุมเมื่อ ghci ทำการเปลี่ยนตัวหรือไม่?