bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Haskell ドリル18 filter関数(解答)

問題1:文字のリストからブランクを取り除く。

Prelude> filter (\x -> x /= ' ') "I am very happy."
"Iamveryhappy."

問題2:文字のリストから文字’a’を取り除く。

Prelude> filter (\x -> x /= 'a') "I am very happy."
"I m very hppy."

問題3:数のリストから3の倍数を取り除く。

Prelude> filter (\x -> mod x 3 /=0) [3,7,2,6,8,14,63,45]
[7,2,8,14]

問題4:文字のリストから大文字を取り除く。
答:要素でないという関数はnotElemである。

Prelude> filter (\x -> x `notElem` ['A'..'Z']) "I am very happy in Tokyo Festival."
" am very happy in okyo estival."

問題5:文字のリストから、2あるいは3の倍数を取り除く。

Prelude> filter (\x -> mod x 2 /= 0 && mod x 3 /= 0) [3,7,2,6,8,14,63,45]
[7]

問題6:数と文字の対を要素とするリストから、例えば[(3,’s’), (36,’d’),…]、その数が10以上である対を取り除く。

Prelude> filter (\(x,y) -> x < 10) [(3,'s'), (36,'d'), (9,'w'), (15,'r'), (10,'W')] 
[(3,'s'),(9,'w')]

問題7:苗字のリストから”Tanaka”を取り除く。

Prelude> filter (\x -> x/= "Tanaka") ["Yamada", "Suzuki", "Tanaka", "Wada"]
["Yamada","Suzuki","Wada"]

問題8:苗字のリストから文字’S’で始まる苗字を取り除く。

Prelude> filter (\x -> head x /= 'S') ["Yamada", "Suzuki", "Tanaka", "Wada", "Suyama"]
["Yamada","Tanaka","Wada"]

問題9:苗字と成績(100点満点)の対を要素とするリストから、成績が80点以上の対を取り出す。

Prelude> filter (\(x,y) -> y >= 80) [("Yamada",80), ("Suzuki",45), ("Tanaka",79), ("Wada",85), ("Suyama",59)]
[("Yamada",80),("Wada",85)]

問題10:苗字と数学と英語の成績(それぞれ100点満点)のタプルから、合計点が100点未満のタプルを取り出す。

Prelude> filter (\(x,math,eng) -> math + eng < 100) [("Yamada",80,20), ("Suzuki",45,34), ("Tanaka",79,20), ("Wada",85,60), ("Suyama",59,10)]
[("Suzuki",45,34),("Tanaka",79,20),("Suyama",59,10)]