3

リストのリストからリスト全体をフィルタリングする方法を知りたい

Example: [ ["Bob", "Baker", "male", "70000"],
         ["Alice", "Allen", "female", "82000"] ] 

そして今、女性を含むリストをフィルタリングしたいと思います。したがって、出力は次のようになります。

["Alice", "Allen", "female", "82000"]

ありがとう

4

2 に答える 2

8

Ankur の回答は確かにあなたの問題を解決しますが、あなたの生活を楽にする提案をしたいと思います。すべてのデータを文字列としてリストに格納しているように見えますが、実際には、このすべてのデータをより整理された方法で保持できるデータ型が必要です。これは、Haskell データ型を使用して行うことができます。

data Person = Person {
    firstName :: String,
    lastName :: String,
    gender :: String,
    salary :: String
    } deriving (Eq, Show)

次に、を使用してデータを簡単に並べ替えることができますfilter (("female" ==) . gender) a。これは前もってのコードではありますが、後で「Mr」、「Mrs」などの「タイトル」フィールドを追加する場合は、最初のフィールドとして追加したか、最後のフィールドでは、このコードは引き続き機能します。また、何らかの理由で のような無効な値があった場合["Bob", "Baker", "male", "70000", "female"]、Ankur のソリューションでは間違った結果が返されますが、カスタム データ型では、これはコンパイルさえしません。

いくつかの調整を加えることで、データ構造をさらに改善できます。性別のデータ型を作成し、給与フィールドにIntorを使用することをお勧めします。Double

data Gender = Male | Female deriving (Eq, Show, Read)

data Person = Person {
    firstName :: String,
    lastName :: String,
    gender :: Gender,
    salary :: Int
    } deriving (Eq, Show)

filtGender :: Gender -> [Person] -> [Person]
filtGender gend people = filter ((gend ==) . gender) people

main :: IO ()
main = do
    let people = [Person "Bob" "Baker" Male 70000,
                  Person "Alice" "Allen" Female 82000]
    putStr "The females are: "
    print $ filtGender Female people
    putStr "The males are: "
    print $ filtGender Male people
于 2013-09-24T13:20:44.123 に答える