আমি আমার লাইব্রেরিগুলির জন্য টাইপ করা টাইপগুলি ghci প্রদর্শন করার জন্য যতটা সম্ভব স্বজ্ঞাত চেষ্টা করার চেষ্টা করছি, তবে আরও উন্নত প্রকারের বৈশিষ্ট্যগুলি ব্যবহার করার সময় আমি অনেক অসুবিধায় পড়েছি।
ধরা যাক আমার একটি ফাইলটিতে এই কোড রয়েছে:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Container (xs::[*]) = Container
আমি এটিকে ghci এ লোড করি, তারপরে আমি নিম্নলিখিত কমান্ডটি টাইপ করি:
ghci> :t undefined :: Container '[String,String,String,String,String]
দুর্ভাগ্যক্রমে, gci আমাকে বরং কুৎসিত চেহারা দেয়:
:: Container
((':)
*
String
((':)
* String ((':) * String ((':) * String ((':) * String ('[] *))))))
টাইপ স্তরের স্ট্রিংগুলির জন্য চিনি অপসারণ করেছে gh Gci কে এটি করতে বাধা দেওয়ার কোনও উপায় আছে এবং আমাকে কেবল সুন্দর সংস্করণ দিচ্ছেন?
সম্পর্কিত নোটে, বলি আমি একটি টাইপ স্তর 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
এখন, যখন আমি ব্যবহার করে টাইপ জিজ্ঞাসা করি LotsOfStrings
:
ghci> :t undefined :: Container LotsOfStrings
ghci সুন্দর এবং আমাকে সুন্দর ফলাফল দেয়:
undefined :: Container LotsOfStrings
তবে আমি যদি Replicate
ডি সংস্করণ চাই,
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
টাইপ প্রতিশব্দ জন্য যখন এটি না করে তখন টাইপ পরিবারের জন্য জিসিসি বিকল্প করে:
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
কেন টাইপ পরিবারের জন্য বিকল্পটি প্রতিস্থাপন করছেন, কিন্তু টাইপ প্রতিশব্দ নয়? Ghষি বিকল্প কখন করবে তা নিয়ন্ত্রণ করার কোনও উপায় আছে?