Real World Haskell
実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan, John Goerzen, Don Stewart(著)
山下 伸夫, 伊東 勝利
株式会社タイムインターメディア(翻訳)
開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- プログラミング言語: Haskell (純粋関数型)
Real World Haskell』(Bryan O'Sullivan、John Goerzen、Don 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 コメント:
コメントを投稿