0

私はリストを持っています

[1,1,1,1,1]

リストを返す関数を書き込もうとしています

[2,3,4,5,6]

こんな関数マップを使いたい

map (+1) [1,1,1,1,1]

戻ります

[2,2,2,2,2]

その後、返されたリストの最後の4つの要素でマップ関数を呼び出したいので、[2,2,2,2,2]を取得した後、返される最後の4つの[2,2,2,2]でマップを使用したい[3,3,3,3] 最初のマップ呼び出しの最後の 4 つの要素を置き換えるので、[2,3,3,3,3] などを取得します。

map (+1)[1,1,1,1,1] 
map (+1)  [2,2,2,2] 
map (+1)    [3,3,3] 
map (+1)      [4,4] 
map (+1)        [5]

戻ってきた:

[2,2,2,2,2]
[2,3,3,3,3] 
[2,3,4,4,4]
[2,3,4,5,5]
[2,3,4,5,6]

最後のリストのみを返す必要があります...ところで、これは単純化されたバージョンにすぎません。元はリストのリストを持っています...説明した方法で関数を呼び出す方法を理解できません..ありがとう。

4

6 に答える 6

8

私はあなたがのようなものが欲しいと思います

mapTails f [] = []
mapTails f (x:xs) = f x : mapTails f (map f xs)
于 2013-03-18T16:55:49.810 に答える
4

IMO最もエレガントな方法は

zipWith($) $ iterate((+1).) id
于 2013-03-18T17:26:10.760 に答える
3

scanl ほとんどあなたが望むことをします:

Prelude> scanl (+) 1 [1,1,1,1,1]
[1,2,3,4,5,6]

最初の項目を削除できます。これは、渡す初期状態の値です。

Prelude> tail $ scanl (+) 1 [1,1,1,1,1]
[2,3,4,5,6]
于 2013-03-18T16:54:27.987 に答える
1

代わりに、再帰関数を使用して、探していることを実行できます。

myFn :: Num a => [a] -> [a]
myFn []     = []
myFn (x:xs) = x + 1 : (myFn $ map (+1) xs)

main = print $ myFn [1,1,1,1,1]  -- Prints [2,3,4,5,6]

http://codepad.org/wBwynlGtを参照してください

于 2013-03-18T16:56:42.217 に答える
0

アルゴリズムバージョンO(n 2)時間:

plusSlow :: [Int] -> [Int]
plusSlow [] = []
plusSlow (x:xs) = (head mapped):(plusSlow $ tail mapped)
                 where mapped = map (+1) (x:xs)

より速いバージョンO(n)時間:

plusFast :: [Int] -> [Int]
plusFast x = pf x 1

pf :: [Int] -> Int -> [Int]
pf [] _ = []
pf (x:xs) n = (x+n):(pf xs (n+1))
于 2013-03-18T16:55:01.957 に答える
0

このようなものはあなたが望むことをしますか?

startList = [1,1,1,1] -- orwhatever you want it to be 
map (\(x,i) -> x + i) $ zip startList [1..]

zip基本的にリスト内の各要素を追加したいものとペアにし、map 関数はリスト内の各要素をその値に追加して、必要な結果を取得します。

于 2013-03-18T16:50:00.923 に答える