我想看看我是否可以这样做:
说我有一个清单:[1,8,90,100,82]
现在,我想做的是这样的事情
print [8, 90, 100, 82]
print [90, 100, 82]
print [100, 82]
print [82]
Run Code Online (Sandbox Code Playgroud)
所以基本上,我想打印列表的其余部分,直到我得到一个空列表,然后停止.有什么方法可以在Haskell中做到这一点吗?
编辑:我正在寻找一个更通用的解决方案.例如,我也希望能够产生这样的:
清单[10,80,90,82,28]
[70, 80, 72, 18]
[52, 62, 54]
[10, 2]
[8]
Run Code Online (Sandbox Code Playgroud)
如何利用IO monad:
func [_] = return ()
func (_:xs) = print xs >> func xs
Run Code Online (Sandbox Code Playgroud)
当一个人调用它时会导致:
*Main> func [1, 8, 90, 100, 82]
[8,90,100,82]
[90,100,82]
[100,82]
[82]
Run Code Online (Sandbox Code Playgroud)
正如您在此处所读到的,return可以将其视为"无操作"操作,并且>>可以将绑定操作符视为在第二个操作之前执行第一个操作.
您可以使用mapM_函数来应用print列表中的每个元素.有函数tails,返回参数的所有最后一段(但是,它也返回空列表作为最后一个元素,因此,你可以将它与init函数结合).最后,你可以跳过第一个元素,如果你不想打印它,使用函数tail:
import Data.List
main :: IO ()
main = mapM_ print . init . tails $ tail [1, 8, 90, 100, 82]
Run Code Online (Sandbox Code Playgroud)
打印:
[8,90,100,82]
[90,100,82]
[100,82]
[82]
Run Code Online (Sandbox Code Playgroud)
当然,可以使用单独的功能解决您的问题.请注意,我添加了两个函数以使代码更具可读性和可重用性:
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]
Run Code Online (Sandbox Code Playgroud)
另请注意,您应该处理具有空输入列表的案例.在当前的实现中,它将引发错误.