是否有任何非递归术语折叠在 scott 编码列表上?

Is there any non-recursive term that folds over a scott-encoded list?

假设我有一个 scott-encoded 列表,例如:

scott = (\ c n -> c 1 (\ c n -> c 2 (\ c n -> c 3 (\ c n -> n))))

我想要一个接收此类列表并将其转换为实际列表 ([1,2,3]) 的函数,只是此类函数不能递归。也就是说,它必须是 eta-beta 范式。那个函数存在吗?

好的,我试一试。请随时纠正我,因为我不是这方面的专家。

对于任意 xxs,必须是 toList (\c n -> c x xs) 简化为可转换为 x : toList xs 的项。

这只有在我们通过将 (\c n -> c x xs) 应用于某些 cn 将左侧减少到 c x xs 时才有可能。所以toList ~ (\f -> f ? ?)。 (顺便说一句,这是我想不出一个很好的严谨论证的部分;我有一些想法,但 none 非常好。我很乐意听到提示)。

现在肯定是c x xs ~ (x : toList xs)了。但是由于 xxs 是不同的通用变量,并且它们是唯一出现在右侧的变量,所以方程在 Miller's pattern fragment 中,因此 c ~ (\x xs -> x : toList xs) 是它的最通用的解决方案。

因此,对于某些 ntoList 必须减少到 (\f -> f (\x xs -> x : toList xs) n)。显然,toList 不能有范式,因为我们总是可以展开递归事件。