Kütüphanelerim için ghci görüntüleyen türleri olabildiğince sezgisel hale getirmeye çalışıyorum, ancak daha gelişmiş tür özelliklerini kullanırken çok fazla zorlukla karşılaşıyorum.
Diyelim ki bu kod bir dosyada var:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Container (xs::[*]) = Container
Ghci'ye yükledim, sonra aşağıdaki komutu yazıyorum:
ghci> :t undefined :: Container '[String,String,String,String,String]
Ne yazık ki, ghci bana oldukça çirkin bir görünüm veriyor:
:: Container
((':)
*
String
((':)
* String ((':) * String ((':) * String ((':) * String ('[] *))))))
ghci, tür düzey dizeleri için şekeri kaldırdı. Ghci'nin bunu yapmasını ve bana sadece güzel versiyonu vermesini engellemenin bir yolu var mı?
İlgili bir notta, bir tür düzeyinde Replicate
işlev oluşturduğumu varsayalım
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
Şimdi, ghci'den kullanarak bir tür istediğimde LotsOfStrings
:
ghci> :t undefined :: Container LotsOfStrings
ghci güzel ve bana güzel bir sonuç veriyor:
undefined :: Container LotsOfStrings
Ama Replicate
d sürümünü sorarsam ,
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
ghci, tür eşanlamlısı için bunu yapmadığında, tür ailesinin yerine geçer:
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
Ghci neden tür ailesinin yerini alıyor, ancak türle eşanlamlı değil? Ghci'nin ikameyi ne zaman yapacağını kontrol etmenin bir yolu var mı?