2007-06-19
■ [Chapter6] Programming with lists (2日目) 
Exercises 6.1
先に前提を書いておく。
- 各点は「.」か「#」のいずれかで表す。型は Char
- それぞれの行(横1列)を [Char] で表す。
- それぞれの行(横1列)を縦に並べたものをPictureとする。
- Picture :: [ [Char] ] で表す。
- 両方が「.」のときは「.」を返す
- それ以外のときは「#」を返す
関数 superimposeChar を定義する。
superimposeChar :: Char -> Char -> Char
superimposeChar chr1 chr2
| (chr1 == '.') && (chr2 == '.') = '.'
| otherwise = '#'
Exercises 6.2
superimposeChar について、引数として [Char] を取るよう拡張した関数 superimposeLine を定義する。
superimposeLine :: [Char] -> [Char] -> [Char]
superimposeLine line1 line2
= [ superimposeChar chr1 chr2 | (chr1, chr2) <- (zip line1 line2) ]
ヒントにもあったんだけど、いったんzipを使うのがポイントのようだ。リスト内包表記も奥が深いな。
Exercises 6.3
superimposeChar の適用範囲を Picture まで拡張した関数 superimpose を定義する。
superimpose :: Picture -> Picture -> Picture
superimpose pic1 pic2
= [ [ superimpose chr1 chr2 | (chr1, chr2) <- (zip line1 line2) ] | (line1, line2) <- (zip pic1 pic2) ]
Exercises 6.4
superimpose 関数の場合、入力された [ [Char] ] 型の組に対して、[ [Char] ] 型の値を返すことしか出来ないので、putStr関数と組み合わせて、ちゃんと絵っぽく表示できるようにしなさい、という問題。
printPicture :: Picture -> IO()
今後の学習
残Section数 89, 残Exercise数 364