我来自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"]
如何获得所需的输出?
答案 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]