2013年2月22日金曜日

開発環境

Real World Haskell』(Bryan O'SullivanJohn GoerzenDon 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 コメント:

コメントを投稿