0

2 つのリストがあります。1 つのリストにはいくつかのランダム データが含まれ、もう 1 つのリストには削除する必要がある最初のリストのインデックスが含まれます。

たとえば、次の 2 つのリストを考えてみましょう。

let a = [3,4,5,6,6,7,8]
let b = [1,3]

次に、結果の出力は になります[3,5,6,7,8]。番号 4 と 6 は、それぞれインデックス位置 1 と 3 にあるため、削除されます。

私は Haskell を初めて使用するので、解決策を見つけるのが難しいと感じています。

更新:次のコードはそれを機能させます

import Data.List
dele :: Eq a => [a] -> [Int] -> [a]
dele [] _ = []
dele x [] = x
dele x (y:ys) = dele (delete (x !! y) x) ys

map/fold way で解決する方法はありますか?

4

3 に答える 3

2

私の頭の上から:

removeByIndex :: [Integer] -> [a] -> [a]
removeByIndex indices = map snd . filter notInIndices . zip [0..]
    where notInIndices (i,_) = i `notElem` indices
于 2012-12-31T05:44:31.223 に答える
2
deleteByIndex :: (Enum a, Eq a, Num a) => [a] -> [b] -> [b]
deleteByIndex r = map snd . filter (\(i, _) -> notElem i r) . zip [0..]

[0..]無限リストを生成する[0, 1, 2, 3, ...]

zipこのリストの値とフォームの入力リストを使用してペアのリストを作成します[(0,x), (1, y), ...]

filter関数を取りますa -> Bool。ラムダは、インデックス (ペアの最初の要素) が入力リストにあるかどうかをチェックしますr

map sndzip リストの各ペアの 2 番目の要素を返します。

zipfiltermapおよびここnotElemに文書化されています

于 2012-12-31T05:28:15.880 に答える
1

最近かなり注目されているレンズライブラリを使用した代替回答

import Control.Lens
>let a = [3,4,5,6,6,7,8]
>let b = [1,3]
>a^..elements (`notElem`b)
[3,5,6,7,8]

(^..) は toListOf の中置詞であり、構造をトラバースしてその部分からリストを作成するために使用できます。要素関数では、含める要素を選択できます。

他のオプションは、traversables をトラバースするための 'traverse'、(,) をトラバースするための 'both' であり、それらは (.) と一緒に構成されるため、たとえば traverse.both は [(1,2), (3,4)] をトラバースします。

[(1,2), (3,4)]^..traverse.both [1,2,3,4]

于 2013-01-02T07:46:54.630 に答える