Haskell 使用Typeable有效地匹配不同类型的大小写

Haskell 使用Typeable有效地匹配不同类型的大小写,haskell,Haskell,我大致希望实现以下目标: f :: a -> a g :: b -> b h :: Typeable t => t -> Maybe t h x = case x of (x is of type a) -> Just (f x) (x is of type b) -> Just (g x) _ -> Nothing 下面是我在中概述的想法的代码。您需要ScopedTypeVariables来告诉解释程序调用eqT的类型 infixl 4

我大致希望实现以下目标:

f :: a -> a
g :: b -> b

h :: Typeable t => t -> Maybe t
h x = case x of
  (x is of type a) -> Just (f x)
  (x is of type b) -> Just (g x)
  _ -> Nothing

下面是我在中概述的想法的代码。您需要
ScopedTypeVariables
来告诉解释程序调用
eqT
的类型

infixl 4 <?>
(<?>) :: forall a b. (Typeable a, Typeable b) => (a -> a) -> b -> Maybe b
f <?> x = fmap (\Refl -> f x) (eqT :: Maybe (a :~: b))

h :: Typeable t => t -> Maybe t
h x = f <?> x
  <|> g <?> x
infixl4
()::全部a b。(可键入a,可键入b)=>(a->a)->b->可能是b
fx=fmap(\Refl->fx)(eqT::Maybe(a:~:b))
h::Typeable t=>t->Maybe t
hx=fx
Gx

可能需要一些解释
f x
尝试将
f
应用于
x
,如果其类型匹配。测试两个
Typeable
字典,查看
a
b
是否为同一类型。如果是,则返回
Just Refl
,这是它们是相同类型的GADT证明。正如我在lambda中所做的那样,
Refl
上的模式匹配将这种平等性引入了范围。在lambda的主体中,GHC知道
a~b
,因此我们可以安全地将
f
应用到
x

也许需要注意的是,您还可以编写一个版本的
,使用更强的类型
(可键入的a,可键入的b)=>(a->a->a->Maybe(b->b)
;在这种类型下,
只是
演员
@user2407038哦,当然!我甚至没想到。那么我的答案中的
就是
sequenceA。强制转换
。美好的