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

Jam*_*ell 0 haskell

我试图创建一个函数,它将采取两个整数值,对应于1s矩形的宽度和高度,输出如下:

 Main> rectangle 3 4
 1111
 1111
 1111
Run Code Online (Sandbox Code Playgroud)

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

Tob*_*ary 5

rectangle :: Int -> Int -> String
rectangle h w = unlines (replicate h (replicate w '1'))
Run Code Online (Sandbox Code Playgroud)

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

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

replicate :: Int -> a -> [a]
unlines :: [String] -> String
Run Code Online (Sandbox Code Playgroud)

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

现在,String再次复制,h次,给出h该字符串的列表.

unlines 现在连接这些字符串,在字符串之间插入一个新的行字符.

结果就是你所期望的,只有那个ghci(你似乎正在使用它)将每个表达式的结果包装在一个show调用中.因此,要完成您想要实现的目标,需要调用putStrin in:

impureRectangle :: Int -> Int -> IO ()
impureRectangle x y = putStr (rectangle x y)
Run Code Online (Sandbox Code Playgroud)

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