2

在 Laemmel 和 SPJ 的 2003 Scrap Your Boilerplate 论文中,第 3 页有一个代码片段

mkT :: (Typeable a, Typeable b) => (b -> b) -> a -> a
mkT f = case cast f of
   Just g -> g
   Nothing -> id

然后论文解释了

也就是说,如果 x 的类型与 f 的参数类型相同,则 mkT fx 将 f 应用于 x

按照本文前面示例的模式,我认为cast f必须将 的类型与上面的类型Maybe (b -> b)进行比较才能评估为Just g,但这似乎不正确。

这里的签名是怎么回事cast f

4

1 回答 1

4

的类型cast

cast :: (Typeable x, Typeable y) => x -> Maybe y

它会产生Nothingifxyare different types 以及Just argument它们是否相同。请注意,结果类型y必须在cast使用时从调用上下文中确定。如果不是,则编译失败并出现未解决的重载/模糊类型变量错误。

在这个特定示例中,类型是函数类型,(b -> b)用于参数和(a -> a)结果。所以

cast f :: Maybe (a -> a)

mkT可以写成mkT = fromMaybe id . cast

于 2012-07-07T13:27:01.013 回答