1

我是 Haskell 编程的新手。在练习时,我被要求制作一个如下所示的递归函数:

repeat1 5 [1,2,3] = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]

这是

repeat1 :: Int -> a -> [a]
repeat1 0 x = []
repeat1 num x = x : repeat1 (num-1) x

我想把它转换成一个foldr函数,但我不能:(我已经从http://en.wikibooks.org/wiki/Haskell/List_processing
阅读了关于 lambda 函数和折叠(foldrfoldl)函数的信息

有人可以帮忙吗?
提前致谢

4

3 回答 3

4

foldr适用于使用列表的函数。对于生成列表,unfoldr是更自然的选择:

repeat1 :: Int -> a -> [a]
repeat1 n x = unfoldr f n
  where f 0 = Nothing
        f n = Just (x, n-1)

也就是说,在这种情况下,我认为将其写为普通递归更清楚。

于 2012-11-14T21:58:34.720 回答
2

正如 hammar 指出的那样,foldr这不是正确的工具,因为您首先需要一个列表来处理。为什么不简单...

repeat1 n = take n . repeat 
于 2012-11-15T07:22:24.987 回答
1

如果你真的想使用foldr,你可以这样做:

repeat' n x = foldr (\_ acc -> x:acc) [] [1..n]

您基本上创建一个大小列表,n[1..n]为该列表的每个元素添加x到您的累加器(基值[])。最后你有一个 n 元素列表x

于 2012-11-15T08:34:51.087 回答