迭代列表,直到结果列表为空列表

时间:2015-05-30 02:43:49

标签: haskell io-monad

我试图看看我是否可以这样做:

说我有一个清单:[1,8,90,100,82]

现在,我想做的是这样的事情

print [8, 90, 100, 82]
print [90, 100, 82]
print [100, 82]
print [82]

所以基本上,我想打印列表的其余部分,直到我得到一个空列表,然后停止。我有什么方法可以在Haskell中做到这一点吗?

编辑:我正在寻找更通用的解决方案。例如,我也希望能够产生这个:

列表[10,80,90,82,28]

 [70, 80, 72, 18]
 [52, 62, 54]
 [10, 2]
 [8]

2 个答案:

答案 0 :(得分:6)

如何利用IO monad:

func [_] = return ()
func (_:xs) = print xs >> func xs

当人们调用它时会导致:

*Main> func [1, 8, 90, 100, 82]
[8,90,100,82]
[90,100,82]
[100,82]
[82]

正如您可以阅读herereturn可被视为“无操作”操作,绑定操作符>>可被视为执行第一个操作之前第二次操作

答案 1 :(得分:6)

您可以使用mapM_函数为列表中的每个元素应用print。有函数tails,返回参数的所有最后段(但是,它也返回空列表作为最后一个元素,因此,您可以将它与init函数组合)。最后,您可以跳过第一个元素,如果您不想打印它,请使用函数tail

import Data.List

main :: IO ()
main = mapM_ print . init . tails $ tail [1, 8, 90, 100, 82]

打印:

[8,90,100,82]
[90,100,82]
[100,82]
[82]

当然,可以使用单独的功能解决您的问题。请注意,我添加了两个函数来使代码更具可读性和可重用性:

import Data.List

tailsExceptOriginalAndEmpty :: [a] -> [[a]]
tailsExceptOriginalAndEmpty = init . tails . tail

printListofLists :: (Show a) => [[a]] -> IO ()
printListofLists = mapM_ print

printTailsExceptOriginalAndEmpty :: (Show a) => [a] -> IO ()
printTailsExceptOriginalAndEmpty = printListofLists . tailsExceptOriginalAndEmpty

main :: IO ()
main = printTailsExceptOriginalAndEmpty [1, 8, 90, 100, 82]

另请注意,您应该处理具有空输入列表的案例。在当前的实现中,它会引发错误。