üzerinden endekslenen bir veri türü ile eşleşen kalıplarda yer alan kalıpları anlamak için, Haskell'de DataKinds
ve TypeFamilies
ile oynuyordum ve oluşturulan Core GHC'ye bakmaya başladım. İşte Kullanıcı tanımlı bir tür
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
module TestCase where
data Ty = TyBool | TyInt
type family InterpTy (t :: Ty) :: *
type instance InterpTy TyBool = Bool
type instance InterpTy TyInt = Int
data Expr (a :: Ty) where
I :: Int -> Expr TyInt
B :: Bool -> Expr TyBool
eval :: Expr a -> InterpTy a
eval (I i) = i
eval (B b) = b
en
TestCase.eval =
\ (@ (a_aKM :: TestCase.Ty)) (ds_dL3 :: TestCase.Expr a_aKM) ->
case ds_dL3 of _ [Occ=Dead] {
TestCase.I dt_dLh i_as6 ->
i_as6
`cast` (Sub (Sym TestCase.TFCo:R:InterpTyTyInt[0])
; (TestCase.InterpTy (Sym dt_dLh))_R
:: GHC.Types.Int ~# TestCase.InterpTy a_aKM);
TestCase.B dt_dLc b_as7 ->
b_as7
`cast` (Sub (Sym TestCase.TFCo:R:InterpTyTyBool[0])
; (TestCase.InterpTy (Sym dt_dLc))_R
:: GHC.Types.Bool ~# TestCase.InterpTy a_aKM)
}
Açıkçası hakkında bilgi taşımanıza gerek eval
fonksiyon için oluşturulan Çekirdek bir göz atalım neyi a
belirli bir dalda olabilir. Ben TypeFamilies bir Datakind üzerinde indeksleme yoktur ve kullanmak ister ise dökme anlamak için çok daha kolaydır.
(Sub (Sym TestCase.TFCo:R:InterpTyTyInt[0])
; (TestCase.InterpTy (Sym dt_dLh))_R
:: GHC.Types.Int ~# TestCase.InterpTy a_aKM);
ikinci satır gerçekten karıştırır şudur:
Main.eval =
\ (@ a_a1hg) (ds_d1sQ :: Main.Simpl a_a1hg) ->
case ds_d1sQ of _ [Occ=Dead] {
Main.I' dt_d1to i_aFa ->
i_aFa
`cast` (Sub (Sym dt_d1to) :: GHC.Integer.Type.Integer ~# a_a1hg);
Main.B' dt_d1tk b_aFb ->
b_aFb `cast` (Sub (Sym dt_d1tk) :: GHC.Types.Bool ~# a_a1hg)
}
Gayet iyi anlayabiliyorum Bu ne TypeFamilies
örnekte beni rahatsız bu parçasıdır:
Böyle bir şey olurdu ben mi. Burada yapılan noktalı virgül nedir? Burası biraz bozuk görünüyor mu yoksa bir şey mi özlüyorum?
Saygılarımızla Ben bu kadar okuyabilen bir yer var mı
raichoo
Darn, Ben bu kağıdı okudum ama bu nasıl oldu da aklımda: D Teşekkürler ^^ – raichoo