मैं अपने पुस्तकालयों के लिए संभव के रूप में प्रदर्शित करने के लिए प्रकार 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
डी संस्करण के लिए पूछना ,
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
ghci प्रकार परिवार के लिए विकल्प है जब उसने ऐसा नहीं किया है जो टाइप के पर्यायवाची के लिए है:
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
क्यों ghci प्रकार परिवार के लिए प्रतिस्थापन कर रहा है, लेकिन प्रकार समानार्थक नहीं? क्या नियंत्रण करने का कोई तरीका है जब ghci प्रतिस्थापन करेगा?