種類 [*] のファントム型でデータを折り畳もうとしています。ここに私のコードの簡略版があります
{-# LANGUAGE DataKinds, KindSignatures #-}
module Stack where
import Data.HList
import Data.Foldable as F
data T (a :: [*]) = T (Tagged a String)
(!++!) :: T a -> T b -> T (HAppendList a b)
(T a) !++! (T b) = T (Tagged (untag a ++ untag b))
a = T (Tagged "1") :: T '[Int]
b = T (Tagged "-- ") :: T '[]
ab = a !++! b :: T '[Int]
フォールドオペレーターが欲しい
(!++*) :: (Foldable t ) => T a -> t (T '[]) -> T a
a !++* t = F.foldl (!++!) a t
しかし、それはうまくいきません。a
とは異なりHAppendList a '[]
ますが、そうではありません。
コンパイルHAppendList a '[]
で とを統合できないのはなぜa
ですか?
(ただし、ghciで手動で折り畳むことはできません:t a !++! b !++! b !++! b => T '[Int]