Ich habe vor kurzem auf vinyl
lesen, die seltsame "Liste der Arten" ein bisschen Typen verwendet. Nach der Lektüre ein wenig auf Arten und Vinyl, ich habe so etwas wie ein intuitives Verständnis von ihnen bekommen, und ich habe diese zusammenWie genau funktionieren Listen?
{-# LANGUAGE DataKinds,
TypeOperators,
FlexibleInstances,
FlexibleContexts,
KindSignatures,
GADTs #-}
module Main where
-- from the data kinds page, with HCons replaced with :+:
data HList :: [*] -> * where
HNil :: HList '[]
(:+:) :: a -> HList t -> HList (a ': t)
infixr 8 :+:
instance Show (HList '[]) where
show _ = "[]"
instance (Show a, Show (HList t)) => Show (HList (a ': t)) where
show (x :+: xs) = show x ++ " : " ++ show xs
class ISum a where
isum :: Integral t => a -> t
instance ISum (HList '[]) where
isum _ = 0
instance (Integral a, ISum (HList t)) => ISum (HList (a ': t)) where
isum (x :+: xs) = fromIntegral x + isum xs
-- explicit type signatures just to check if I got them right
alist :: HList '[Integer]
alist = (3::Integer) :+: HNil
blist :: HList '[Integer,Int]
blist = (3::Integer) :+: (3::Int) :+: HNil
main :: IO()
main = do
print alist
print (isum alist :: Int)
print blist
print (isum blist :: Integer)
:i HList
ergeben
data HList $a where
HNil :: HList ('[] *)
(:+:) :: a -> (HList t) -> HList ((':) * a t)
-- Defined at /tmp/test.hs:10:6
instance Show (HList ('[] *)) -- Defined at /tmp/test.hs:17:10
instance (Show a, Show (HList t)) => Show (HList ((':) * a t))
-- Defined at /tmp/test.hs:19:10
instance ISum (HList ('[] *)) -- Defined at /tmp/test.hs:25:10
instance (Integral a, ISum (HList t)) => ISum (HList ((':) * a t))
-- Defined at /tmp/test.hs:29:10
*Main> :i HList
data HList $a where
HNil :: HList ('[] *)
(:+:) :: a -> (HList t) -> HList ((':) * a t)
-- Defined at /tmp/test.hs:10:6
instance Show (HList ('[] *)) -- Defined at /tmp/test.hs:17:10
instance (Show a, Show (HList t)) => Show (HList ((':) * a t))
-- Defined at /tmp/test.hs:19:10
instance ISum (HList ('[] *)) -- Defined at /tmp/test.hs:25:10
instance (Integral a, ISum (HList t)) => ISum (HList ((':) * a t))
-- Defined at /tmp/test.hs:29:10
aus dem ich in der Lage zu hacken Sammeln Sie, dass '[]
Zucker für '[] *
und x ': y
für (':) * x y
ist. Was macht das da? Ist es die Art der Listenelemente? Was genau ist eine solche Liste? Ist es etwas in die Sprache eingebaut?
Sehr klar! Ich habe seit einiger Zeit damit zu kämpfen, diese Syntax gründlich zu lesen. –
Ich verstehe das meiste dieser Antwort nicht wirklich.Dein Beispiel funktioniert nur für mich mit -XPolyKinds - eine andere Erweiterung, die ich nicht ganz verstehe - und ': t Foo' für mich ist' y -> Foo * * x y z' anstatt was du hast. Wenn ich versuche, eine Funktion foo einzuführen - du hast keine Definition angegeben, also habe ich 'foo x y = Foo y' versucht - GHC gerät in Panik mit" dem Unmöglichen ist passiert ". – Cubic