是否有任何非递归术语折叠在 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 范式。那个函数存在吗?
好的,我试一试。请随时纠正我,因为我不是这方面的专家。
对于任意 x
和 xs
,必须是 toList (\c n -> c x xs)
简化为可转换为 x : toList xs
的项。
这只有在我们通过将 (\c n -> c x xs)
应用于某些 c
和 n
将左侧减少到 c x xs
时才有可能。所以toList ~ (\f -> f ? ?)
。 (顺便说一句,这是我想不出一个很好的严谨论证的部分;我有一些想法,但 none 非常好。我很乐意听到提示)。
现在肯定是c x xs ~ (x : toList xs)
了。但是由于 x
和 xs
是不同的通用变量,并且它们是唯一出现在右侧的变量,所以方程在 Miller's pattern fragment 中,因此 c ~ (\x xs -> x : toList xs)
是它的最通用的解决方案。
因此,对于某些 n
,toList
必须减少到 (\f -> f (\x xs -> x : toList xs) n)
。显然,toList
不能有范式,因为我们总是可以展开递归事件。
假设我有一个 scott-encoded 列表,例如:
scott = (\ c n -> c 1 (\ c n -> c 2 (\ c n -> c 3 (\ c n -> n))))
我想要一个接收此类列表并将其转换为实际列表 ([1,2,3]
) 的函数,只是此类函数不能递归。也就是说,它必须是 eta-beta 范式。那个函数存在吗?
好的,我试一试。请随时纠正我,因为我不是这方面的专家。
对于任意 x
和 xs
,必须是 toList (\c n -> c x xs)
简化为可转换为 x : toList xs
的项。
这只有在我们通过将 (\c n -> c x xs)
应用于某些 c
和 n
将左侧减少到 c x xs
时才有可能。所以toList ~ (\f -> f ? ?)
。 (顺便说一句,这是我想不出一个很好的严谨论证的部分;我有一些想法,但 none 非常好。我很乐意听到提示)。
现在肯定是c x xs ~ (x : toList xs)
了。但是由于 x
和 xs
是不同的通用变量,并且它们是唯一出现在右侧的变量,所以方程在 Miller's pattern fragment 中,因此 c ~ (\x xs -> x : toList xs)
是它的最通用的解决方案。
因此,对于某些 n
,toList
必须减少到 (\f -> f (\x xs -> x : toList xs) n)
。显然,toList
不能有范式,因为我们总是可以展开递归事件。