プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやるITエンジニアがスキルアップの話を中心に日常を綴るブログです。

「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]