我对Haskell很新。我试图通过打印来改善我的代码"嗨"按此顺序。例如,n = 4,输出为:
Hi
Hi Hi
Hi Hi Hi
Hi Hi Hi Hi
我目前的代码是:
printHi :: Integer -> String
printHi n = concat["Hi" | n <- [0..n-1]]
,其输出为:
Hi Hi Hi Hi
关于我将如何执行此任务的任何提示?感谢
答案 0 :(得分:2)
有两种可能的方法。
一个是构建一个大字符串,包含所有"Hi"
部分和所需的换行符。之后,打印字符串就足够了。 (这就是jamshidh上面所做的)。
或者,可以使用更“强制”的方法并使用循环。例如,
import Control.Monad
foo :: IO ()
foo = forM_ [1..100] $ \i ->
putStrLn ("The current value of i is" ++ show i)
会打印从1
到100
的号码,每个号码都会显示一条短消息。将其与您的案例相适应是一种练习。
(flip traverse_
也可以用来代替forM_
)
第一种风格可能更灵活,因为精心设计的字符串可以在非IO上下文中重用。但是,如果我们确定我们永远不会将该字符串用于其他目的而不是打印它,那么第二种方法就足够了。
答案 1 :(得分:1)
这是一种打印方式&#34; hi&#34; 4次....
putStrLn $ unwords $ replicate 4 "hi"
这是一种打印上面显示的三角形图案的方法
putStrLn $ unlines $ map (unwords . flip replicate "hi") [1..4]
答案 2 :(得分:0)
听起来像你想要使用&#39; scanl&#39;。 scanl就像折叠一样,只是它保存了中间体 结果。如果您有一个列表,如[&#34;嗨&#34;,&#34;嗨&#34;,&#34;嗨&#34;,&#34;嗨&#34;]。 与(++)折叠将产生类似&#34; HiHiHiHi&#34;的字符串。 使用scanl,中间结果也将被保存 - &GT; [&#34;&#34;,&#34;嗨&#34;,&#34; HiHi&#34; ......等等。
现在,如果我无耻地接受你的代码并稍微修改它 结果可能是这个:
printHi :: Integer -> [String]
printHi n = scanl (++) "" ["Hi " | n <- [0..n-1]]
我在&#34;嗨&#34;使它看起来更像一点 你的问题。所以结果将是一个如下所示的列表:
["", "Hi ", "Hi Hi ", "Hi Hi Hi ", "Hi Hi Hi Hi "]
希望这能回答你的问题。
亲切的问候,
修改强>:
如果您使用&#34; unlines&#34;它将产生的结果列表 问题中所述的期望输出,当然还有空字符串 在列表的开头可以删除&#39; tail&#39;如果你想这样做的话。