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

时间:2015-11-12 01:40:12

标签: 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 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

我注意到我应该在printLine中使用printBox,因为printLineprintBox功能的一部分。

但是,我尝试了很多次并且悲惨地失败了。如何在printLine中使用printBox来达到同样的效果?我应该以某种方式重复它吗?

1 个答案:

答案 0 :(得分:3)

您可以使用replicateM_中的Control.Monad按如下方式实现此目的:

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)

有效地,该函数会复制您的monadic动作n次并丢弃结果。可以找到文档here

Demo