「Ansi Common Lisp」6章練習問題 - Haskell版
3. 任意の数の引数をとり、その引数の個数を返す関数を定義せよ。
Haskellで可変長引数って一応できるらしいけど、なんか難しそう。
Text.Printfモジュールのソース読めっていう乱暴な(?)エントリ見つけたのでリンクしときます。
http://ja.doukaku.org/comment/4401/
4. most(94ページ)を改変して、リストの上位2つの要素を2値として返すようにせよ。
こないだコメント欄で教えてもらった、ガードとwhere節を使う書き方にしてみました。
すっきりしてて良いですね。
most :: (a -> Int) -> [a] -> (a,a) most fn (x:[]) = (x,x) most fn (x:xs) | (fn x) > fn(fst result) = (x, (fst result)) | (fn x) > fn(snd result) = ((fst result), x) | otherwise = result where result = most fn xs main = do print $ most (\n -> n) [3,1,2,5,4] print $ most length ["ab", "abc", "a"]
結果はこう。
(5,4) ("abc","ab")
空リストを渡すとパターンマッチしないので落ちます。
そういう場合はどう返すべきなのか、未だに分かってない。。
5. filter(94ページ)を使ってremove-if(キーワードなし)を定義せよ
removeIfEx6_5 :: (Eq a) => a -> [a] -> [a] removeIfEx6_5 x y = filter (\n -> n /= x) y main = print $ removeIfEx6_5 3 [1..5]
結果はこう。
[1,2,4,5]