Haskell 是否有任何非递归项可以折叠到scott编码的列表上?

Haskell 是否有任何非递归项可以折叠到scott编码的列表上?,haskell,recursion,lambda-calculus,church-encoding,scott-encoding,Haskell,Recursion,Lambda Calculus,Church Encoding,Scott Encoding,假设我有一个列表,例如: 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的术语 只有

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

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??)
。(顺便说一句,这是我想不出一个好的严谨的论点的部分;我有一些想法,但没有一个非常好的。我很乐意听到提示)

现在肯定是
cxxs~(x:tolistxs)
的情况。但是由于
x
xs
是不同的通用变量,并且它们是唯一出现在右侧的变量,因此方程为,因此
c~(\x xs->x:toList xs)
是其最一般的解


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

是的,这就是我的意思。它不应该是列表末尾的
\cn->c3(\cn->n)
?scott编码列表的类型并不统一-也就是说,每次应用另一个“cons单元格”时,类型都会更改。您需要一个类型类来执行此操作,否则假设的
toList
函数类型错误。@user2407038。我认为这更多的是关于非类型lambda演算,而不是Haskell。我感觉没有这样的术语,但我不知道如何证明。我不知道Miller的模式片段部分,但它在我看来非常正确。免责声明:我(显然)不完全确定这是否正确。