假设我有一个scott-encoded列表,例如:
scott = (\ c n -> c 1 (\ c n -> c 2 (\ c n -> c 3 (\ c n -> n))))
我想要一个接收这种列表并将其转换为实际列表([1,2,3]
)的函数,除了这样的函数不能递归。也就是说,它必须是eta-beta正常形式。该功能是否存在?
答案 0 :(得分:2)
对于任意x
和xs
,必须是toList (\c n -> c x xs)
缩减为可转换为x : toList xs
的字词的情况。
只有将c x xs
应用于某些(\c n -> c x xs)
和c
,我们才能将左侧缩小为n
。所以toList ~ (\f -> f ? ?)
。 (顺便说一句,这是我无法想到一个严谨的论点的部分;我有一些想法,但没有一点非常好。我很乐意听到提示)。
现在必须是c x xs ~ (x : toList xs)
的情况。但由于x
和xs
是不同的通用变量,并且它们是右侧发生的唯一变量,因此等式位于Miller's pattern fragment,因此c ~ (\x xs -> x : toList xs)
是其toList
最通用的解决方案
因此,对于某些(\f -> f (\x xs -> x : toList xs) n)
,n
必须减少到toList
。显然,{{1}}不能具有正常形式,因为我们总是可以展开递归事件。