2007-12-03
2007-06-21
■ [Chapter6] Programming with lists (4日目) 
6.2 Extended exercise: positioned pictures
今度は、 Picture に座標 (Position) の概念を加えてみましょう、という話。 Position を含む Picture を Image として再定義している。
type Position = (Int,Int)
type Image = (Picture, Position)
Exercises 6.9
Picture と Position から Image を作る makeImage 関数を定義する。
makeImage :: Picture -> Position -> Image
Exercises 6.10
指定した Position を Image に再設定する関数 changePosition 関数を定義する。
changePosition :: Image -> Position -> Image
Exercises 6.11
x軸に指定した数だけ移動させ、y軸にも指定した数だけ移動させる関数 moveImage を定義する。
moveImage :: Image -> Int -> Int -> Image
moveImage img xmov ymov = ( (fst img), ( (xmov + (fst $ snd img) ) , (ymov + (snd $ snd img) ) ) )
Exercises 6.12
Exercises 6.4 の printPicture のように、絵っぽく表示する関数 printImage を定義する。
printImage :: Image -> IO()
printImage img = putStr $ unlines $
[ "|" ++ (replicate (fst $ snd img) ' ') ++ line | line <- (fst img) ] ++
(replicate (snd $ snd img) ( "|" ++ replicate ( (fst $ snd img) + (length $ head $ fst img) ) ' ') )
++ [ ("+" ++ replicate ( (fst $ snd img) + (length $ head $ fst img) ) '-') ]
うわ。あとでもう少し整理しないと・・・。
今後の学習
残Section数 88, 残Exercise数 356
Andralyn2012/01/08 15:50Great insight! That's the answer we've been lokonig for.
hagvmaooe2012/01/09 02:09Y16YzX <a href="http://pppyvokzjahc.com/">pppyvokzjahc</a>
ttqrgxrcy2012/01/09 21:25CqKQ4q , [url=http://hgspixnethev.com/]hgspixnethev[/url], [link=http://rumxclteqvlu.com/]rumxclteqvlu[/link], http://tqeueagtggux.com/
myfrzsivhnj2012/01/14 03:46SeRADp , [url=http://gadujgwfohas.com/]gadujgwfohas[/url], [link=http://oceaosehzcrk.com/]oceaosehzcrk[/link], http://dswfycruoqgp.com/
2007-06-20
■ [Chapter6] Programming with lists (3日目) 
Exercises 6.5
Picture を [ [Bool] ] を使って表すようにしたら、どうなるか、という話。大まかにまとめると
- superimposeChar は、Bool向けに全部書き直しになる('.'や'#'もふくめて)
- superimposeLine は、[Char] 型を [Bool] 型に書き直すだけで十分。関数の枠組は使いまわせる。
- 上記2つの関数が修正されてさえいれば、superimpose は、全く修正せずともOK。
- printPicture を構築する際、Bool型の表現をChar型に変換する必要がある。これは、[ [Bool] ]型のメリットでもあり、デメリットでもある。
- デメリット:変換するための関数を定義する必要がある。
- メリット:変換するための関数を定義すれば、'#'と'.'の2文字に表現を縛られなくても済む。変換関数を書き換えることで、(コンパイラ/インタプリタが許す範囲で)どんな文字でも使うことが出来る。
Exercises 6.6
Picture を時計回りに90°回転させる関数 rotate90 を定義する。先に下ごしらえとして、各Pictureの先頭要素だけを取り出してリスト化する関数 headList と、先頭以外の要素だけを取り出してリスト化する関数 tailList を定義する。
headList :: [ [Char] ] -> [Char]
headList list
| list == [ ] = [ ]
tailList :: [ [Char] ] -> [ [Char] ]
tailList list
| list == [ [ ] ] = [ ]
その上で、rotate90を定義する。
rotate90 :: Picture -> Picture
rotate90 pic
| (length $ concat pic) == 0 = [ ]
| otherwise = (reverse $ headList pic) : (rotate90 $ tailList pic)
こうやって定義してみると、簡単に作ったように見えるなあ。いいことなんだけど、ちょっと切ない。
Exercises 6.7
rotate90 を使って、反時計回りに90°回転させる関数 rotate270 を定義する。
rotate270 :: Picture -> Picture
Exercises 6.8
Picture と倍率を定義し、Pictureを倍率分だけ拡大する scale 関数を定義する。
scale :: Picture -> Int -> Picture
scale pic num
| num <= 0 = [ ]
| otherwise = concat [ replicate num $ concat $ [ replicate num chr | chr <- line ] | line <- pic ]
replicateとconcatの繰り返し。なんだか汚いなあ。
今後の学習
残Section数 89, 残Exercise数 360
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
2007-06-18
■ [お知らせ] 10000ページビュー 
Haskellネタなんてマイナーなので、誰も読みはしないだろう、と思いつつ始めたこの日記。約8ヶ月で10000ページビューになりました。ありがとうございます。
更新ペースを考えると、まだまだ先は長いですが、まだまだ頑張りますので、よろしくお願いします。
■ [Chapter6] Programming with lists (1日目) 
Section 6.1 The Picture example, revisited
Chapter1 なんかで使われた、あの図
. . . . . . . ## . . .
. . . . . ## . . # . .
. . . ##. . . . . #.
. . #. . . . . . . #.
. . #. . . #. . . #.
. . #. . . ###. #.
. #. . . . #. . ##.
. . #. . . #. . . . .
. . . #. . . #. . . .
. . . . . #. #. . . .
. . . . . . ##. . . .
をまた使うことになりました、という話。Picture型は以下のように定義する。
type Picture = [ [Char] ]
あとは、基本的な操作を行うための関数を定義している。
今後の学習
残Section数 89, 残Exercise数 368
■ [Haskellな日々] Haskellグループの過疎ぶりについて 
トップページを見ると、たくさんのサイトが更新されているように見えますが、そのほとんどはスパム書き込みによるもの。「誰か更新してないかなー」と思いながら見に行っても無駄です。
理由はスパムが多すぎるから。とにかく死んでいる(更新のない)ユーザが多く、更新を検出してもスパム書き込みであることが多すぎる。
はてなの haskell グループを「関数的なアンテナ」から外そうかと考えています
せめて、各ユーザについて、強制的にスパムフィルタをONにさせる運用にはできないものか。かなり我慢がならなくなってきているんだけど、こういうのって、結城さんにメールすればよいのかな。