0

私はHaskellが初めてです。値しかわかっていない場合、リスト内の 2 つの要素を交換する関数が必要です。

例えば:

swap 5 6 [1,5,7,6,4,3,2] -> [1,6,7,5,4,3,2]

56はインデックスではなく値であり、値のインデックスは任意です。

4

2 に答える 2

7

このタスクを、値を入れ替えてリストを再構築するものと考えてください。型シグネチャは次のようになります。交換する 2 つの数値とリストを取り込んでいます。

swap :: Int -> Int -> [Int] -> [Int]

あなたは今、いくつかのケースを持っています。リストが空の場合、それは簡単です。これが基本ケースです。

swap _ _ [] = []

リストが空でない場合は、2 つの選択肢があります。リストの先頭は、関心のある数字であるか、そうでないかのどちらかです。一致する場合は値を交換し、そうでない場合はリストを再構築します。

swap n m (x:xs)
  | n == x = m : (swap n m xs)
  | m == x = n : (swap n m xs)
  | otherwise = x : (swap n m xs)

この状況になると、すべての要素に対して操作を行っていることがわかります。これで、それをソリューションに変換できますmap(これははるかに慣用的です!)。

于 2013-03-20T17:41:28.560 に答える
5
swap a b = map (\x -> if x == a then b else if x == b then a else x)

編集:ああ、私は私の答えを投稿した後、この質問が上記のコメントでまったく同じ方法で答えられたことに気づいただけだと思います。謝罪。

于 2013-03-20T17:40:44.603 に答える