mazinlabsのブログ

RubyとかCloudとかその辺の記事を書いたり書かなかったり

「プログラミングHaskell」を読み始めたわけなのだが

社内で毎週こっそりと行われている読書会の次の図書がこうなった。

プログラミングHaskell
プログラミングHaskell
posted with amazlet at 10.06.15
Graham Hutton
オーム社
売り上げランキング: 97172
おすすめ度の平均: 5.0
5 アカデミックな意味で「おもしろい」!
5 わかるってたのしいなー。
5 Haskell

原書は大学の教科書らしく、わかりやすく書かれている上に、章末には演習問題がついているまさに教科書。


関数型言語なんて会社で使う機会もないから学んでも仕方がない・・・」
ってこともなく、プログラムの考え方や数学的思考が学べるので個人的には引き出しが広がる良い選択肢だと思う。


だがこの数学的というのが問題で、高校以来まともに数学やっていないうろ覚えの頭ではたまに辛いw
数学的帰納法とかが出てくるのでプログラムというより数学っぽい。


また、読書会では今回講義形式&問題を解くといった形なので予習が必要。


とりあえず、2章の問題の一分をやってみたので載せておく。

問題:
以下で示すライブラリ関数を使って、空でないリストの最後の要素を取り出す関数lastを定義せよ。さらに他の定義も考えよ。

・空でないリストの先頭の要素を取り出す:
> head [1, 2, 3, 4, 5]
1
 
・空でないリストの(0番目から数えて)n番目の要素を取り出す:
> [1, 2, 3, 4, 5]!!2
3

・リストから先頭のnこの要素を取り除く:
> drop 3 [1, 2, 3, 4, 5]
[4, 5]

・リストの長さを計算する:
> length [1, 2, 3, 4, 5]
5

・リストを逆順にする:
> reverse [1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

自分の解答を3つほど載せておく。

-- リストを逆順にしてその先頭を取り出す。
myLast1 xs = head (reverse xs)

-- リストの先頭からリストの長さ-1の要素を取り出す。
myLast2 xs = xs!!((length xs) - 1)

-- リストの末尾以外を取り除き、最後に残った末尾要素をリストから取り出す。
myLast3 xs = head (drop ((length xs) - 1) xs )

実行結果

*Main> myLast1 [1, 2, 3, 4, 5]
5
*Main> myLast2 [1, 2, 3, 4, 5]
5
*Main> myLast3 [1, 2, 3, 4, 5]
5

たぶんあってるはず。