在Haskell中将字符串作为模式打印

时间:2012-02-01 12:02:39

标签: haskell

我来自OO背景,对Haskell来说很新。 为了打印如下模式:

1 2 3 4 5
1 2 3 4
1 2 3
1 2
1

我列了一个清单

let xs = ["1 2 3 4 5\n"
         ,"1 2 3 4\n"
         ,"1 2 3\n"
         ,"1 2\n"
         ,"1\n"]

但我得到了像

这样的输出
["1 2 3 4 5\n","1 2 3 4\n","1 2 3\n","1 2\n","1\n"]

如何获得所需的输出?

5 个答案:

答案 0 :(得分:8)

添加更多内置物品:

您不需要手动为这样的模式生成行:

triangle :: Int -> String
triangle n = unlines . map (unwords . map show) $ [[1 .. k] | k <- [n, n-1 .. 1]]

Prelude> putStr $ triangle 7
1 2 3 4 5 6 7
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1

import Data.List (intersperse)

triangleOf :: [Char] -> Int -> String
triangleOf chars n = unlines . map (intersperse ' ') $ [take k chars | k <- [n, n-1 .. 1]]

Prelude Data.List> putStr $ triangleOf "Haskell" 7
H a s k e l l
H a s k e l
H a s k e
H a s k
H a s
H a
H

您可以使用takeWhile (not . null) (tails chars)获取其他模式,但有很多变化。

答案 1 :(得分:5)

简短的回答是

mapM_ putStr xs

基本上,这会为列表中的每个成员执行action putStr。也就是说,它将xs中的每个字符串都打印出来。

顺便提一下,您从show xs看到的输出是有效的Haskell表达式 - 您可以将其传递给read函数以重新创建xs

答案 2 :(得分:4)

只是详细说明一下,你可以像这样做两件事:

ghci> putStrLn $ unlines $ ["1 2 3 4 5"
                           ,"1 2 3 4"
                           ,"1 2 3"
                           ,"1 2"
                           ,"1"]

$ 的优先级非常低并且是正确关联的,因此其行为方式与

相同
ghci> (putStrLn (unlines ["1 2 3 4 5"
         ,"1 2 3 4"
         ,"1 2 3"
         ,"1 2"
         ,"1"]))

答案 3 :(得分:1)

您可以使用unlines函数将字符串列表转换为单个字符串,并将'\ n'作为deliminator。它就像一个.join('\ n')

unlines ["1", "2", "3"] 

产量

"1\n2\n3\n"

然后你可以使用putStrLn打印它(只打印字符串)或打印(打印所有对象)

答案 4 :(得分:0)

import Data.List

putStr $ unlines $ map (unwords.(map show)) $ reverse $ inits [1..5]