说,我得到一个长度可以是奇数或偶数的列表。每次迭代,我从列表中删除两个项目。如果最后有一个项目或没有项目,我结束执行。
如果我在每个循环中存储(长度列表)/ 2,我会得到例如[5,4,3 ...]以获取长度为10的列表。
但我想要的是[1,2,3,...],我无法找出列表大小与此序列之间的关系...
有没有办法在没有存储当前计数的变量的情况下实现这一目标?
即。仅限func :: [Int] -> [Int]
答案 0 :(得分:1)
你可以在不更改func :: [Int] -> [Int]
的类型签名的情况下执行此操作:让func
调用另一个函数,这需要一个额外的参数,即你所讨论的计数器:
func :: [Int] -> [Int]
func = go 0
where go _ [] = []
go _ [x] = []
go n (a:b:xs) = n : a : b : go (succ n) xs
func [11,12..20]
[0,11,12,1,13,14,2,15,16,3,17,18,4,19,20]
如果您决定在不自行管理计数器变量的情况下执行此操作,则可以执行更多扭曲的操作,例如将输入列表压缩为3元组(a,b,n)
,其中a
和{{1输入列表中的项目对和b
来自n
。
[1,2..]
在我看来,这个可读性相当低,我建议你在我的第一个片段中做一些简单明了的事情。
答案 1 :(得分:0)
好的,这是另一个解决方案:
func :: [a] -> [Int]
func (_:_:as) = 1 : map (+1) (func as)
func _ = []
我有点不清楚你想要的基本情况,所以我猜你想要func [] = []
和func [_] = []
。如果我错了,请纠正我。
完成10个元素列表示例:
func ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] =
1 : map (+1) (func ['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']) =
1 : map (+1) (1 : map (+1) (func ['e', 'f', 'g', 'h', 'i', 'j'])) =
1 : map (+1) (1 : map (+1) (1 : map (+1) (func ['g', 'h', 'i', 'j']))) =
1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : map (+1) (func ['i', 'j'])))) =
1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : map (+1) (func []))))) =
1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : map (+1) [])))) =
1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : [])))) =
1 : map (+1) (1 : map (+1) (1 : map (+1) (1 : 2 : []))) =
1 : map (+1) (1 : map (+1) (1 : 2 : 3 : [])) =
1 : map (+1) (1 : 2 : 3 : 4 : [])) =
1 : 2 : 3 : 4 : 5 : []) =
[1,2,3,4,5]