Function 在这种情况下,如何重复功能?哈斯克尔

Function 在这种情况下,如何重复功能?哈斯克尔,function,haskell,functional-programming,Function,Haskell,Functional Programming,我有一个函数可以画一行字符串,还有一个函数可以画一盒字符串: duplicate :: [a] -> Int -> [a] -- Duplicates a string/array duplicate dup n = concat $ replicate n dup printLine :: String -> Int -> IO () -- Prints a line of strings printLine str n = putStrLn $ duplicate

我有一个函数可以画一行字符串,还有一个函数可以画一盒字符串:

duplicate :: [a] -> Int -> [a] -- Duplicates a string/array
duplicate dup n = concat $ replicate n dup

printLine :: String -> Int -> IO () -- Prints a line of strings
printLine str n = putStrLn $ duplicate str n

printBox :: String -> Int -> Int -> IO () -- Prints a box of strings
printBox str width height = putStrLn $ unlines $ replicate height $ duplicate str width

main :: IO ()
main = printBox "-" 10 10 -- Will print 10x10 box of "-" string
我注意到我应该在
printBox
中使用
printLine
,因为
printLine
printBox
功能的一部分


然而,我尝试了很多次,结果惨败。如何在
printBox
中使用
printLine
达到相同的效果?我是否应该以某种方式重复它?

您可以使用
Control.Monad
中的
replicateM\uuuu
来实现此功能,如下所示:

import Control.Monad

main :: IO ()
main = printBox "-" 10 10 -- Will print 10x10 box of "-" string

duplicate :: [a] -> Int -> [a] -- Duplicates a string/array
duplicate dup n = concat $ replicate n dup

printLine :: String -> Int -> IO () -- Prints a line of strings
printLine str n = putStrLn $ duplicate str n

printBox :: String -> Int -> Int -> IO () -- Prints a box of strings
printBox str width height = replicateM_ height (printLine str width)
有效地,该函数将一元操作复制n次并丢弃结果。可以找到文档


谢谢!我甚至不知道这个函数。我还注意到你把
main
放在上面,并删除了
main::IO()
行,你能详细说明一下吗?哦,我用于演示的网站就是这样的。没有其他意义:)@g99,可能省略了类型签名以节省时间。它应该包含在真正的代码中。@dfeur,应该吗?这就是所说的:“按照惯例,我们通常不为
main
”指定类型声明。我确信这是很普遍的。@user3237465,我想说LYAH是错的。许多人使用
-Wall
,这将警告丢失的签名。