遍历列表直到结果列表为空列表
Iterate over a list until the resulting list is an empty list
我正在尝试看看我是否可以做这样的事情:
假设我有一个列表:[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]
如何利用 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]
如您所见here,return
可以看作是 "no operation" 操作,绑定运算符 >>
可以看作 在第二个操作之前执行第一个操作.
您可以使用 mapM_
函数为列表中的每个元素应用 print
。有函数 tails
,returns 参数的所有最后部分(但是,它也是 returns 空列表作为最后一个元素,因此,您可以将它与 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]
另请注意,您应该处理输入列表为空的情况。在当前的实现中,它会引发错误。
我正在尝试看看我是否可以做这样的事情:
假设我有一个列表:[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]
如何利用 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]
如您所见here,return
可以看作是 "no operation" 操作,绑定运算符 >>
可以看作 在第二个操作之前执行第一个操作.
您可以使用 mapM_
函数为列表中的每个元素应用 print
。有函数 tails
,returns 参数的所有最后部分(但是,它也是 returns 空列表作为最后一个元素,因此,您可以将它与 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]
另请注意,您应该处理输入列表为空的情况。在当前的实现中,它会引发错误。