0

文字列のリストから文字列のペアに含まれる文字列を削除し、残りのすべての文字列を含むリストのみを返す Haskell 関数を定義したいと考えています。したがって、例は次のようになります。

function ["football","basketball","soccer"] ("football", "basketball") = ["soccer"]

filter関数を使用して、指定された述語を満たすリストをフィルター処理できることを知っています。この方法でリストを除外できることを知っています。

function' xs s = filter (/=s) xs

しかし、これをタプルで機能させる方法がわかりません。コードを実行するとエラーが発生し続けます。これを行う方法はありますか?ありがとう

4

3 に答える 3

2

より一般的な解決策は、単なるペアではなく、文字列のリストを使用してフィルタリングします。さらに一般的な解決策は、Eq文字列だけでなく、サポートするもののリストを使用することです。

だから、私たちはタイプのあるものを探しています:

Eq a => [a] -> [a] -> [a]

フーグルをすばやく検索すると、(\\)

import Data.List ((\\))

main = print $ ["football","basketball","soccer"] \\ ["football", "basketball"]
于 2012-10-09T04:22:25.513 に答える
1
myfunc :: Eq a => [a] -> (a, a) -> [a]
myfunc xs (a,b) = filter (\x -> (x /= a) && (x /= b)) xs

タイプを見てみましょうfilter

filter :: (a -> Bool) -> [a] -> [a]

これを行うと、リストのすべての要素にtypefilter f xsの関数が適用され、この関数が返す要素が削除されます。fa -> BoolFalse

タプル as の要素に一致するパターンがあり、(a,b)関数fを as として定義しまし\x -> (x /= a) && (x /= b)た。Trueこれは、リストの要素を取り、それがタプルの最初の要素にも 2 番目の要素にも等しくない場合にのみ返す無名関数です。&&はブール値であるため、両方の引数が である場合にのみand返されます。TrueTrue

于 2012-10-09T03:52:59.733 に答える
1

最も簡単な方法は、フィルターを 2 回実行することです。

tupleFilter :: (Eq a) => [a] -> (a, a) -> [a]
tupleFilter xs (a, b) = function' (function' xs a) b

ただし、ここで重要なのは、フィルターで要素を使用する前に、タプルをパターン マッチ (または分解) することです。

これは、中間フィルター関数のないバージョンです。この場合、将来の読みやすさのためにおそらくインライン化する必要があります。

tupleFilter xs (a, b) = filter (\x -> (x /= a) && (x /= b)) xs
于 2012-10-09T04:06:32.690 に答える