类型上的模式匹配

时间:2017-07-03 12:30:17

标签: haskell

是否有很好的方法来编写以下内容" 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

Follow up question

1 个答案:

答案 0 :(得分:3)

这是Data.Typeable的“类型安全转换”位的作业。 cast :: (Typeable a, Typeable b) => a -> Maybe bTypeablea的{​​{1}}词典中提取运行时类型信息并进行比较;如果ba是相同类型,则返回b其参数,否则失败。

因此,有Justcast Maybe个实例,我们有:

Alternative

据我所知,没有办法避免重复调用h x = f <$> cast x <|> g <$> cast x ,因为它们发生在不同类型。