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できません:(
ラムダ関数とfolding(foldrおよびfoldl)関数についてはhttp://en.wikibooks.org/wiki/Haskell/List_processingから読みました。

誰か助けてもらえますか?
前もって感謝します

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]に追加します。最後に、のn要素リストがあります。x[]x

于 2012-11-15T08:34:51.087 に答える