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)の4章(関数プログラミング)の4.6(ループをどのように考えるか)の練習問題7.を解いてみる。
7.
コード(BBEdit)
Sample.hs
-- file: Sample.hs import Data.List import Data.Char myAny :: (a -> Bool) -> [a] -> Bool myAny p xs = foldr step False xs where step x ys | ys || p x = True | otherwise = False myAny' :: (a -> Bool) -> [a] -> Bool myAny' p xs = foldl' step False xs where step acc x | acc || p x = True | otherwise = False a = [] b = [1] c = [2] d = [1,2] e = [2,1] f = [1,1,2] g = [2,2,1] h = [1,2,1] i = [2,1,2] j = [2,1,1] myLines :: String -> [String] myLines xs = foldr step [] xs where step x (y:ys) | x == '\n' = []:(y:ys) | otherwise = (x:y):ys step x [] | x == '\n' = []:[] | otherwise = (x:[]):[] k = "haskell\nlisp\njavascript\npython\n" l = "haskell\nlisp\njavascript\npython" m = "\nhaskell\nlisp\njavascript\npython" n = "\nhaskell\nlisp\njavascript\npython\n" o = "" p = "k" q = "\n"
入出力結果(Terminal, ghci)
*Main> :load Sample.hs [1 of 1] Compiling Main ( Sample.hs, interpreted ) Ok, modules loaded: Main. *Main> any odd a False *Main> myAny odd a False *Main> myAny' odd a False *Main> any odd b True *Main> myAny odd b True *Main> myAny' odd b True *Main> any odd c False *Main> myAny odd c False *Main> myAny' odd c False *Main> any odd d True *Main> myAny odd d True *Main> myAny' odd d True *Main> any odd e True *Main> myAny odd e True *Main> myAny' odd e True *Main> any odd f True *Main> myAny odd f True *Main> myAny' odd f True *Main> any odd g True *Main> myAny odd g True *Main> myAny' odd g True *Main> any odd h True *Main> myAny odd h True *Main> myAny' odd h True *Main> any odd i True *Main> myAny odd i True *Main> myAny' odd i True *Main> any odd j True *Main> myAny odd j True *Main> myAny' odd j True *Main> myLines q [""] *Main> lines q [""] *Main> lines k ["haskell","lisp","javascript","python"] *Main> myLines k ["haskell","lisp","javascript","python"] *Main> lines l ["haskell","lisp","javascript","python"] *Main> myLines l ["haskell","lisp","javascript","python"] *Main> lines m ["","haskell","lisp","javascript","python"] *Main> myLines m ["","haskell","lisp","javascript","python"] *Main> lines n ["","haskell","lisp","javascript","python"] *Main> myLines n ["","haskell","lisp","javascript","python"] *Main> lines o [] *Main> myLines o [] *Main> lines p ["k"] *Main> myLines p ["k"] *Main> lines q [""] *Main> myLines q [""]
メモ:
cycle、wordsについてはまだ分からず。(もしかしたら畳み込みを使って書き直せないのかな。cycleは書き直せなくてwordsは書き直せそうな気がするけど。。)
anyはfoldl'とfoldrのどちらを使ってでも書けたけど、どっちの方が適切というのはなさそう。
linesについては、右畳み込みを使ってしか書き直す方法思いつかなかった。(右から畳み込む場合は改行出てきたら蓄積値の先頭に空文字を付け加えて、最後にそれが残っても問題ない(というか、先頭が改行の場合は空文字が必要)だけど、左畳み込みで似たような事を上手くする方法が思いつかなかった。)
0 コメント:
コメントを投稿