から値を抽出する 2 つの関数を作成しようとしていますが、HList
GHC を満足させることができないようです。
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
か?