我正在尝试编写两个函数来从 中提取值HList
,但我似乎无法让 GHC 高兴。
第一个函数将具有从列表extract :: HList a -> [b]
中提取所有类型元素的签名。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
约束来编写任何提取实例。
我试图在约束中使用类型等式和不等式,但这只会给我重叠的实例。
我尝试编写的第二个函数将具有extract' :: Contains h n => HList h -> n
提取n
列表中类型的第一个元素的签名,并且上下文表明列表实际上包含该类型的一个元素。
extract
可以不受约束地写作Typeable
吗?
extract'
可以不受约束地写作Typeable
吗?一个人怎么写Contains
?