私はvinyl
で最近読んできました。これは奇妙な種類のリストを使用しています。種類やビニールの上にビットを読んだ後、私はやや彼らの直感的な理解の得ている、と私はこれをハックすることができました一緒に種類リストはどのくらい正確に機能しますか?
{-# 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
利回り
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
そこからIその'[]
は'[] *
の糖であり、(':) * x y
のx ': y
である。それは何ですか?リスト要素の種類ですか?とにかく、そのようなリストはどういうものですか?それは言語に組み込まれたものですか?
非常にクリア!私はしばらくの間、この構文を完全に理解することに苦労してきました。 –
私はこの答えのほとんどを本当に理解していません。あなたの例は-XPolyKinds(私が理解していない別の拡張機能)だけで動作します。私にとって ':t Foo'はあなたのものではなく' y - > Foo * * x y z'です。私が関数fooを導入しようとすると、あなたは定義を与えなかったので、 'foo x y = Foo y'を試しました - GHCのパニックは"不可能な出来事 "でパニックになります。 – Cubic