我试图创建一个函数,它将采取两个整数值,对应于1s矩形的宽度和高度,输出如下:
Main> rectangle 3 4
1111
1111
1111
Run Code Online (Sandbox Code Playgroud)
我是Haskell的初学者并且没有经验,所以任何指针都会受到赞赏,因此只应该使用基本的Haskell操作.谢谢.
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,人们用来了解这些)并不是最容易理解的东西.我建议保持纯洁直到你感到安全.