Haskell - 创建具有用户输入的高度和宽度的1s矩形

时间:2015-11-24 13:19:09

标签: haskell

我正在尝试创建一个函数,该函数将采用两个整数值,这些值对应于1s矩形的宽度和高度,如下所示:

 Main> rectangle 3 4
 1111
 1111
 1111

我是Haskell的初学者并且没有经验,所以任何指针都会受到赞赏,因此只应该使用基本的Haskell操作。感谢。

1 个答案:

答案 0 :(得分:5)

rectangle :: Int -> Int -> String
rectangle h w = unlines (replicate h (replicate w '1'))

虽然这是一个纯函数,但它确实显示了相关部分。您可以putStrLn (rectangle 3 4)将其按照ghci中的预期打印出来,而不是用show打包。

再考虑一下,这是一个简短的演练。

replicate :: Int -> a -> [a]
unlines :: [String] -> String

正如您所看到的,replicate w '1'创建了一个列表中的字符1。因为String = [Char],结果是一串1,就像w所说的那样多。

现在,这个String再次被复制,h次,给出了h次该字符串的列表。

unlines现在连接这些字符串,在字符串之间插入换行符。

结果就是您所期望的,只有ghci(您似乎正在使用)才会在show调用中包含每个表达式的结果。因此,要完全按照您要实现的目标,在需要时调用putStr

impureRectangle :: Int -> Int -> IO ()
impureRectangle x y = putStr (rectangle x y)

请注意monad(或IO,作为第一个monad,人们用来了解这些)并不是最容易理解的东西。我建议保持纯洁,直到你感到安全为止。