1

次のようなタプルのリストがあります。

let tups = [("AA","BB",1),
            ("AA","CC",2),
            ("AA","BB",3),
            ("VV","RR",4),
            ("XX","TT",5),
            ("BB","BB",6)]

AA最初の要素がで、2 番目の要素がであるタプルのみを除外したいと思いBBます。私は使用しようとしていました:

filter (\(x,y,_) -> x /= "AA" && y /= "BB") tups

上記のコマンドは、最初の要素が「AA」であるタプルまたは 2 番目の要素が「BB」であるタプルを削除します。したがって、出力は次のようになります。

[("VV","RR",4), ("XX","TT",5)]

最初の要素が "AA" で 2 番目の要素が "BB" であるタプルのみを削除するフィルター関数を作成するにはどうすればよいですか? 正しい出力は次のようになります。

[("AA","CC",2), ("VV","RR",4), ("XX","TT",5), ("BB","BB",6)]
4

4 に答える 4

8

ブール代数。削除したいものは条件を満たしています

x == "AA" && y == "BB"

ブール代数は、

¬(x and y) = ¬x or ¬y

したがって、ラムダの条件は

x /= "AA" || y /= "BB"

filter提供された述語が返すすべてのものを保持するためですTrue

于 2012-08-31T09:30:27.653 に答える
6

ドキュメントで読めるように、filter :: (a -> Bool) -> [a] -> [a]は、述語を満たす要素のリストを返します。Trueこれは、保持する要素に対してのみ述語を返さなければならないことを意味します。

したがって、リクエストを言い換えることで、最初の要素が「AA」と異なる、または 2 番目の要素が「BB」と異なるすべてのトリプルを保持したいと考えています。

filter (\(x,y,_)-> x /= "AA" || y /= "BB" ) tups
于 2012-08-31T09:31:42.877 に答える
1

意図をより明確にする何かが必要な場合は、次を試してください。

filter (\(x,y,_) -> not $ x == "AA" && y == "BB") tups
于 2012-08-31T13:54:04.223 に答える
0
filter (\(x,y,_) -> x /= "AA" || y /= "BB") tups

やりたいことをやってくれる。&&and||演算子を混同しています。フィルターは、述語が真であるすべてのものを取得するため、持っていないものは"AA"すべて返され、y「BB」ではないものはすべて返されます。

于 2012-08-31T09:29:55.050 に答える