是否有很好的方法来编写以下内容" x的类型为t"部分? (我怀疑我应该使用Data.Type.Equality,但我不确定如何)
f :: a -> Int
g :: b -> Int
h :: Typeable t => t -> Maybe Int
h x = case x of
(x is of type a) -> Just (f x)
(x is of type b) -> Just (g x)
_ -> Nothing
答案 0 :(得分:3)
这是Data.Typeable
的“类型安全转换”位的作业。 cast :: (Typeable a, Typeable b) => a -> Maybe b
从Typeable
和a
的{{1}}词典中提取运行时类型信息并进行比较;如果b
和a
是相同类型,则返回b
其参数,否则失败。
因此,有Just
和cast
Maybe
个实例,我们有:
Alternative
据我所知,没有办法避免重复调用h x = f <$> cast x
<|> g <$> cast x
,因为它们发生在不同类型。