在 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
?