リストの1つの要素にのみ関数を適用するにはどうすればよいですか? 提案がありますか?リストの特定の要素に関数を適用する方法
例:
let list = [1,2,3,4,3,6]
function x = x * 2
in ...
私はわずか3の最初のoccuranceにfunction
を適用し、そこに停止します。
出力:
List = [1,2,6,4,3,6] -- [1, 2, function 3, 4, 3, 6]
リストの1つの要素にのみ関数を適用するにはどうすればよいですか? 提案がありますか?リストの特定の要素に関数を適用する方法
例:
let list = [1,2,3,4,3,6]
function x = x * 2
in ...
私はわずか3の最初のoccuranceにfunction
を適用し、そこに停止します。
出力:
List = [1,2,6,4,3,6] -- [1, 2, function 3, 4, 3, 6]
あなたはmap
は、すべての値に関数を適用するために、値の最初のインスタンスを示すために、状態のいくつかの種類を維持する必要があります。おそらく、
この
map (\(b,x) -> if (b) then f x else x) $ markFirst 3 [1,2,3,4,3,6]
と
markFirst :: a -> [a] -> [(Boolean,a)]
markFirst a [] = []
markFirst a (x:xs) | x==a = (True,x): zip (repeat False) xs
| otherwise = (False,x): markFirst a xs
のようなもの、私はもっと簡単な方法があると確信しているが、それは私が感謝祭の前日に、この時点で思い付いたのが最善です。ここで
をマッピングするためにマッピングするかしないかを
> let leftap f (x,y) = f x ++ y
leftap (map (\x -> if(x==3) then f x else x)) $ splitAt 3 [1,2,3,4,3,6]
以下のコメントに基づいて別のアプローチである、それが問題です。
地図を表示しないようにしてください。
なぜですか?とにかくmap id == id
だから、という1つの要素を使ってマップしたいだけです。最初のものは与えられた引数と等しいと分かります。
したがって、リストを2つに分割し、見つかった要素を変更して、それらをすべてまとめて接着します。シンプル。
参照:span :: (a -> Bool) -> [a] -> ([a], [a])
書き込み:revappend (xs :: [a]) (ys :: [a])
== append (reverse xs) ys
、効率的です。
または、すべての要素を1つの機能にまとめます。手動再帰を使用して直接コード化することも、foldr
を使用してコード化することもできます。あなたが(\x xs r -> ...)
多様の結合機能を必要とするようfoldr
は、直接のフィットではありません、が、
map f xs = foldr (\x r -> f x : r) [] xs
takeWhile p xs = foldr (\x r -> if p x then x : r else []) [] xs
takeUntil p xs = foldr (\x r -> if p x then [x] else x : r) [] xs
filter p xs = foldr (\x r -> if p x then x : r else r) [] xs
duplicate xs = foldr (\x r -> x : x : r) [] xs
mapFirstThat p f xs = -- ... your function
などを覚えておいてください。これは、パラモフィスとして知られており、代わりにをfoldr
に供給することによってcan be fakedになります。
あなたはわずか2によってその倍数の数を単純な関数を作成することができます。
times_two :: (Num a) => a -> a
times_two x = x * 2
そして、単にリスト内の指定された要素を検索し、それにtimes_two
を適用します。このような何かは仕事ができる:
*Main> map_one_element 3 times_two [1,2,3,4,3,6]
[1,2,6,4,3,6]
あなたの側にどんな試みを次のように動作します
を? –
さらに、リストに2つ(またはそれ以上)が3つある場合はどうなりますか? –
これはIntのリストです! – JohnnyPire