简而言之,我的问题是我正在解析数字列表([Integer]),我想将该列表转换为嵌套元组,例如列表[1,2,3,4]将变为(1,(2,(3,4)))。我认为可以使用fold操作来实现。我遇到的问题是,在预先确定类型之前,元组嵌套可能会无限增长。
根据评论编辑
谢谢你们的回复,根本问题是一项任务,所以对于更大问题的细节很少,但为了不让你们疑惑,我可以稍微扩展一下,虽然我不需要扩展的答案。我的问题归结为上下文自由语法的右递归和右关联部分的问题,我有这样的东西
A -> n A
所以我可以得到这样的表达式'n n n n A',它解析为'n(n(n(n A)))'(A还有其他终端)。我可以将其解析为'[n,n,n,n] A',这就是我希望进行转换的原因(我知道有更好的方法,只是找不到)。
根据评论编辑
谢谢你们的回复,根本问题是一项任务,所以对于更大问题的细节很少,但为了不让你们疑惑,我可以稍微扩展一下,虽然我不需要扩展的答案。我的问题归结为上下文自由语法的右递归和右关联部分的问题,我有这样的东西
A -> n A
所以我可以得到这样的表达式'n n n n A',它解析为'n(n(n(n A)))'(A还有其他终端)。我可以将其解析为'[n,n,n,n] A',这就是我希望进行转换的原因(我知道有更好的方法,只是找不到)。
data T = Empty | Nonempty (Integer, T)
来表示元组的任意嵌套,但这样做只是给标准列表类型另起一个名字,所以没有什么好处。你为什么认为需要使用元组来处理数据? - chidata NTup t = Here t | There (NTup (Integer,t))
。然后,您可以使用NTup()
来表示任意大小的嵌套元组。当您递归到Here
时,t
将是适当大小的嵌套元组(尝试使用show
查看它)。这被称为非正则类型,在这种情况下我真的看不出做这件事的意义,但这是一个很好的技巧需要了解。 - luqui