我有如下定义的不动点函子:
newtype Fix f =
Fix
{ unfix ::
f (Fix f)
}
我想定义一个函数,它接受 aFix f
并给出其 Böhm-Beraducci 编码。因此它应该具有以下类型:
cata :: Fix f -> (forall a. (f a -> a) -> a)
我可以轻松定义像这样的函数但带有额外的约束f
,Functor
但没有这个限制我就很挣扎。
直观地讲,我想采用 AST 并Fix
用输入函数替换构造函数的所有实例,但实际上这似乎需要一个Functor
实例F
。但据我了解,即使f
不是, Böhm-Beraducci 编码也应该存在Functor
。
我觉得我在这里遗漏了一些简单的东西。我遗漏了什么定义吗?如果Functor
确实需要,为什么?Böhm-Beraducci 编码何时需要像这样的额外约束?