在没有计数器

时间:2015-06-15 19:57:29

标签: haskell

说,我得到一个长度可以是奇数或偶数的列表。每次迭代,我从列表中删除两个项目。如果最后有一个项目或没有项目,我结束执行。

如果我在每个循环中存储(长度列表)/ 2,我会得到例如[5,4,3 ...]以获取长度为10的列表。

但我想要的是[1,2,3,...],我无法找出列表大小与此序列之间的关系...

有没有办法在没有存储当前计数的变量的情况下实现这一目标?

即。仅限func :: [Int] -> [Int]

2 个答案:

答案 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]