4

種類 [*] のファントム型でデータを折り畳もうとしています。ここに私のコードの簡略版があります

{-# 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]

4

1 に答える 1