참고 :
ghci> let hetlist = (1 :: Int) :*: ("two" :: String) :*: (3.0 :: Double) :*:()
ghci> hetlist
((1 :*: "two") :*: 3.0) :*:()
ghci> hetlist == hetlist
True
당신이 당신의 자신의 typeclasses 사용하여 모방 할 수
class DoStuff a where
dostuff :: a -> a
instance DoStuff Int where dostuff i = 2*i
instance DoStuff String where dostuff s = s ++ s
instance DoStuff Double where dostuff d = d/2
instance DoStuff() where dostuff() =()
instance (DoStuff a, DoStuff b) => DoStuff (a :*: b) where
dostuff (a :*: b) = dostuff a :*: dostuff b
을 그리고 컬렉션의 반복이 자동으로
ghci> dostuff hetlist
((2 :*: "twotwo") :*: 1.5) :*:()
다른 방법으로는 ExistentialQuantification
과 래퍼 유형이 인 경우 자신의 목록 유형을 정의 할 필요가 없습니다.
data DoStuffWrapper = forall a. (DoStuff a) => DoStuffWrapper a
homlist = [ DoStuffWrapper (1 :: Int)
, DoStuffWrapper ("two" :: String)
, DoStuffWrapper (3.0 :: Double)
]
homlist' = map (\(DoStuffWrapper a) -> DoStuffWrapper (dostuff a)) homlist
주의,'*''GHC.Generics' – alternative