morioXのCraftお勉強日記 RSSフィード

2007-06-19

[] Programming with lists (2日目)  Programming with lists (2日目)  - morioXのCraftお勉強日記 を含むブックマーク

Exercises 6.1

先に前提を書いておく。

  • 各点は「.」か「#」のいずれかで表す。型は Char
  • それぞれの行(横1列)を [Char] で表す。
  • それぞれの行(横1列)を縦に並べたものをPictureとする。
  • Picture :: [ [Char] ] で表す。

引数として入力した2つの点の組み合わせについて

  • 両方が「.」のときは「.」を返す
  • それ以外のときは「#」を返す

関数 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()

printPicture pic = putStr $ unlines pic


今後の学習

残Section数 89, 残Exercise数 364