2013年1月31日木曜日

開発環境

Real World Haskell』(Bryan O'SullivanJohn GoerzenDon Stewart(著)、山下 伸夫伊東 勝利株式会社タイムインターメディア(翻訳)、オライリー・ジャパン、2009年、ISBN978-4-87311-423-3)の2章(型と関数)の2.12(2つ以上の引数を持つ関数の型)の練習問題1、2、3.を解いてみる。

1、2、3.

コード(BBEdit)

sample.hs

-- file: sample.hs

lastButOne xs = if null (drop 2 xs)
                then head xs
                else lastButOne (tail xs)

これでいいのかなあと思ったら長さが1のとき、最後の1つ前の要素は無いにも関わらず、最後の要素が出力された。

入出力結果(Terminal)

$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :load sample.hs
[1 of 1] Compiling Main             ( sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> lastButOne [1,2,3,4,5]
4
*Main> lastButOne [1,2,3,4]
3
*Main> lastButOne [1,2,3]
2
*Main> lastButOne [1,2]
1
*Main> lastButOne [1]
1

ということで「drop 2 xs」を「tail」を2回使うように修正してみる。(長さを取得する関数あるみたいだけど、まだ出てきてないし、その関数を使わなくても書けるという事だと思うので、既知の関数だけを使ってコードを書いてみる事に。)

コード(BBEdit)

sample.hs

-- file: sample.hs

lastButOne xs = if null (tail (tail xs))
                then head xs
                else lastButOne (tail xs)

入出力結果(Terminal)

*Main> :load sample.hs
[1 of 1] Compiling Main             ( sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> lastButOne [1,2,3,4,5]
4
*Main> lastButOne [1,2,3,4]
3
*Main> lastButOne [1,2,3]
2
*Main> lastButOne [1,2]
1
*Main> lastButOne [1]
*** Exception: Prelude.tail: empty list
*Main> lastButOne ['a','b','c','d']
'c'
*Main> lastButOne ['a','b','c']
'b'
*Main> lastButOne ['a','b']
'a'
*Main> lastButOne ['a']
*** Exception: Prelude.tail: empty list
*Main> :type lastButOne
lastButOne :: [a] -> a
*Main> :quit
Leaving GHCi.
$

例外のメッセージについてはまだ知らないので、とりあえず成功ということに!

0 コメント:

コメントを投稿