重复函数在Haskell中递归

时间:2011-05-29 17:16:45

标签: haskell

我正在尝试创建一个输出char*m n次的函数,因为输入["ccc","ccc"]的预期输出为2 3 c。以下是我到目前为止的情况:

rectangle :: Int -> Int -> Char -> [string]
rectangle n m c 
    | m > 0 = [concat ([[c]] ++ (rectangle n (m-1) c))] 
    | otherwise = []

我能够执行第一部分char*m,因此返回["ccc"]。事情是:我也希望能够重复我的字符串n次。

我尝试过使用复制但它似乎不起作用,但如果在控制台中执行它,它会起作用:replicate 2 (rectangle 2 3 c)

2 个答案:

答案 0 :(得分:7)

以这种方式尝试复制功能:

replicate :: Int -> a -> [a]

rectangle n m c = replicate n (replicate m c)

另外,不要忘记提及这是否是作业。

答案 1 :(得分:1)

作为Refactor答案的附录,我认为他的方法是正确的。他将问题细分为可以使用内置函数轻松解决。如果你想推出自己的解决方案用于学习目的,我建议你保留这个细分,并从那里开始,实现你自己的复制。否则,你将得到一个功能太多的单一功能。

所以剩下的问题是实现复制。我的第一个想法是查看source code的复制。我是通过hoogle找到的,这导致我hackage,其中包含指向源代码的链接。摘自来源:

replicate               :: Int -> a -> [a]
replicate n x           =  take n (repeat x)

这又简洁又简洁,再次使用内置函数。如果您想完全滚动自己的复制,可以执行以下操作:

myReplicate                 :: Int -> a -> [a]
myReplicate n x | n <= 0    = []
                | otherwise = x : replicate (n-1) x

---------- EDIT ----------------

作为旁注,我认为你的问题需要两个相当正交的技能。第一个是试图不立即解决整个问题,而是取得一些小的进展。然后你可以尝试解决那个较小的问题,然后再回到更大的问题。在你的情况下,它可能涉及识别你肯定需要一种方法将角色转换为一系列长度为n的字符。具有map,filter,foldr等功能的经验将为您提供帮助,因为它们各自代表了一种非常独特的转换,您可能会认识到这一转变。

您的解决方案所需的第二项技能 - 如果您想要自己动手 - 正在识别何时可以递归表达函数。正如您所看到的,您的问题 - 实际上是许多常见问题 - 可以在没有明确递归的情况下解决,但在需要时,它是一项很好的技能。递归解决方案并不总是很容易理解,因此我认为熟悉它们的最佳方法是阅读和练习。

为了进一步学习,我确信你已经指出了优秀的Learn You a HaskellReal World Haskell,但万一你还没有,这里就是。