打印字符串' N'在哈斯克尔时代

时间:2016-03-14 04:01:31

标签: haskell design-patterns

我对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

关于我将如何执行此任务的任何提示?感谢

3 个答案:

答案 0 :(得分:2)

有两种可能的方法。

一个是构建一个大字符串,包含所有"Hi"部分和所需的换行符。之后,打印字符串就足够了。 (这就是jamshidh上面所做的)。

或者,可以使用更“强制”的方法并使用循环。例如,

import Control.Monad

foo :: IO ()
foo = forM_ [1..100] $ \i ->
         putStrLn ("The current value of i is" ++ show i)

会打印从1100的号码,每个号码都会显示一条短消息。将其与您的案例相适应是一种练习。

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;如果你想这样做的话。