から値を抽出する 2 つの関数を作成しようとしていますが、HListGHC を満足させることができないようです。
extract :: HList a -> [b]最初の関数には、リストからtype のすべての要素を抽出する署名がありbます。型にインスタンスaを持つように要求することによってのみ、それを書くことに成功しました。Typeable
class OfType a b where
oftype :: a -> [Maybe b]
instance OfType (HList '[]) b where
oftype = const []
instance (Typeable t, Typeable b, OfType (HList ts) b) => OfType (HList (t ': ts)) b where
oftype (x :- xs) = (cast x :: Maybe b) : oftype xs
extract :: OfType a b => a -> [b]
extract = catMaybes . oftype
Typeable抽出のインスタンスを書き込むために制約を実際に必要としないため、これは最適ではありません。
制約で型の等号と不等号を使用しようとしましたが、インスタンスが重複するだけでした。
私が書こうとしている 2 番目の関数には、リスト内extract' :: Contains h n => HList h -> nの型の最初の要素を抽出するシグネチャがnあり、コンテキストは、リストに実際にその型の要素が 1 つ含まれていることを示しています。
制限extractなしで書くことは可能ですか?Typeable
制限extract'なしで書くことは可能ですか?Typeableどのように書くことができますContainsか?