我在Haskell中编写一个递归函数,该函数将一个元组列表作为输入并返回一个元组。返回的元组的第一部分应该是列表中的元组数,返回的元组的第二部分应该是列表中每个元组的所有元素。要清除此问题,示例运行应如下所示:
gather [ (0, [true, true] ), (1, [true, false] ), (2, [false, true]) ]
returns (3, [true, true, true, false, false, true] )
我对Haskell相当陌生,但这是我对递归代码的尝试:
gather [()] = [()]
gather n as = head as : gather n (take n as)
tupList :: [(a)] -> [(a)]
tupList n xs = map (\x -> gather n (take x xs)) [n..]
编译器根本不喜欢这种方法,关于如何解决此问题有什么建议吗?谢谢你的时间!
这是一个递归版本。它仅沿输入列表执行一次通过。进行两次独立通过通常会导致空间泄漏。
gather xs = g 0 xs
where
g c [] = (c, [])
g c ((_,ys):r) = (a, ys ++ b)
where
(a,b) = c `seq` g (c+1) r
seq
当我们沿着列表前进时,会导致立即计算计数器。没有它,c+1
可能会不必要地延迟的计算。
实际上,这是受保护的递归。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句