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

2007-12-03

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

Exercises 6.13 (1日目)

naive view(その場で動かないで、座標を動かす見方)で、flipH, flipV, rotate, rotate90を実装せよ、とのこと。

場所動かないでいいなら、Position そのままで Picture に直接変換をかければいいのかな。とりあえず2つ作ってみる。

flipV :: Image -> Image

flipV img = ( [ reverse line | line <- (fst img) ], (snd img) )

flipH :: Image -> Image

flipH img = ( reverse (fst img), (snd img) )

2007-06-21

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

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

makeImage pic pos = (pic, pos)


Exercises 6.10

指定した Position を Image に再設定する関数 changePosition 関数を定義する。

changePosition :: Image -> Position -> Image

changePosition img pos = ((fst img), pos)


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

AndralynAndralyn2012/01/08 15:50Great insight! That's the answer we've been lokonig for.

hagvmaooehagvmaooe2012/01/09 02:09Y16YzX <a href="http://pppyvokzjahc.com/">pppyvokzjahc</a>

ttqrgxrcyttqrgxrcy2012/01/09 21:25CqKQ4q , [url=http://hgspixnethev.com/]hgspixnethev[/url], [link=http://rumxclteqvlu.com/]rumxclteqvlu[/link], http://tqeueagtggux.com/

myfrzsivhnjmyfrzsivhnj2012/01/14 03:46SeRADp , [url=http://gadujgwfohas.com/]gadujgwfohas[/url], [link=http://oceaosehzcrk.com/]oceaosehzcrk[/link], http://dswfycruoqgp.com/

2007-06-20

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

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 == [ ] = [ ]

 | otherwise = map head list

tailList :: [ [Char] ] -> [ [Char] ]

tailList list

 | list == [ [ ] ] = [ ]

 | otherwise = map tail 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

rotate270 pic = rotate90 $ map reverse pic

高階関数って便利だなあ。教科書的にはもすこし先の章だけど。


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

[] 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

2007-06-18

[] 10000ページビュー  10000ページビュー - morioXのCraftお勉強日記 を含むブックマーク

Haskellネタなんてマイナーなので、誰も読みはしないだろう、と思いつつ始めたこの日記。約8ヶ月で10000ページビューになりました。ありがとうございます。

更新ペースを考えると、まだまだ先は長いですが、まだまだ頑張りますので、よろしくお願いします。

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

Section 6.1 The Picture example, revisited

Chapter1 なんかで使われた、あの図

. . . . . . . ## . . .

. . . . . ## . . # . .

. . . ##. . . . . #.

. . #. . . . . . . #.

. . #. . . #. . . #.

. . #. . . ###. #.

. #. . . . #. . ##.

. . #. . . #. . . . .

. . . #. . . #. . . .

. . . . . #. #. . . .

. . . . . . ##. . . .

をまた使うことになりました、という話。Picture型は以下のように定義する。

type Picture = [ [Char] ]

あとは、基本的な操作を行うための関数を定義している。

今後の学習

残Section数 89, 残Exercise数 368

[] Haskellグループの過疎ぶりについて  Haskellグループの過疎ぶりについて - morioXのCraftお勉強日記 を含むブックマーク

トップページを見ると、たくさんのサイト更新されているように見えますが、そのほとんどスパム書き込みによるもの。「誰か更新してないかなー」と思いながら見に行っても無駄です。

理由はスパムが多すぎるから。とにかく死んでいる(更新のない)ユーザが多く、更新を検出してもスパム書き込みであることが多すぎる。

はてなの haskell グループを「関数的なアンテナ」から外そうかと考えています

せめて、各ユーザについて、強制的にスパムフィルタをONにさせる運用にはできないものか。かなり我慢がならなくなってきているんだけど、こういうのって、結城さんにメールすればよいのかな。

OchirooOchiroo2012/07/24 09:31At last! Someone with real expertise gives us the asnewr. Thanks!

ttmtwbjxettmtwbjxe2012/07/25 02:19qPcdNB <a href="http://mehdkhkfbdrj.com/">mehdkhkfbdrj</a>

ghasqpghasqp2012/07/26 00:16gkSRz4 , [url=http://nmjhedhvjuri.com/]nmjhedhvjuri[/url], [link=http://vmjjtfcvzbon.com/]vmjjtfcvzbon[/link], http://ljxtmrqkimjf.com/

uqtdhyauqtdhya2012/07/26 19:07kd9g3Y <a href="http://lrcamzjpnony.com/">lrcamzjpnony</a>