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