by shigemk2

当面は技術的なことしか書かない

第2期 第11回 H本読書会 in 秋葉原 #readhbon

readhbon.doorkeeper.jp

これをHaskellで

Dashboard - Qualification Round 2015 - Google Code Jam

前回

第7章後半

  • コードや実行例はいちいち読むと時間がかかりすぎるので、飛ばして読むくらいのアレで。
  • ひとり1ページくらいの流れ
  • コード例は入力してきたやつを

7.7 最適なデータ構造

  • 再帰的にやる
  • infixrとかで演算の優先順位を変えたり出来る(右結合とか)
  • :で始まる独自演算子を定義でき、リストを書きやすくする
  • 二分検索木を再帰的にデータ構造を作ってごにょごにょ
  • treeを作るやつ

7.8 型クラス中級講座

  • 独自の型クラスを作り、実装してみる
  • 多相型(Maybe)とか、型クラスのインスタンス
  • 型パラメータをどう消費するか

7.9 YesとNoの型クラス

  • JSみたいに型がいい加減なやつだと、ifの中には何でも書ける
  • これをHaskellでやるにはちょっと無理をしないといけない
  • yesnoの構文を作る

gist.github.com

7.10 Functor

  • 写像
  • MaybeもFunctor
  • いろいろなファンクター

gist.github.com

gist.github.com

7.11 型を司るもの、種類

  • kind、など

では今日

第8章 入出力

I/Oのきほん

  • I/O アクションとは何か?
  • I/O アクションがどうやって入出力を可能にするのか?
  • 実際に I/O アクションが行われるのはいつか?

8.1 不純なものと純粋なものを分離する

一連の実行ステップではなく、あるものが何であるかの定義です。加えて、関数は副作用を持つことを許されません。

例えば、二分探索木を前の章で作りましたが、木そのものを変更して要素を挿入したわけではありません。その代わりに、木に新しい要素を挿入した新しい木を返したのでした。

プログラムについての推論が容易になるのがグロ変を更新したり出来ない言語の利点。

  • 遅延評価
  • 堅牢性
  • 関数合成

8.2 Hello, World!

そういえば、この本で初めてのhello worldだ。

gist.github.com

I/O アクションとは、実行されると副作用(入力を読んだり画面やファイルに何かを書き出したり)を含む動作をして結果を返すような何かです

print系は副作用を持つ関数なのである。 putStrLnはIO()を返す。

gist.github.com

mainは特別なおまじないではなく、ただの関数。

main :: IO ()
main = putStrLn "hello, world"

8.3 I/O アクションどうしをまとめる

doを使えばI/Oアクションを並べることが出来る(=命令形プログラムっぽいことが出来る)

gist.github.com

で、I/Oは箱。箱を取り出すためには特殊なことをしないといけなくって、それはHaskell的には不純と捉えられる

gist.github.com

文字列は文字列としかくっつけられないから、こういうことをしてはいけないよっていう話。

getLine :: IO String

nameTag = "Hello, my name is " ++ getLine

純粋でないデータを扱いたいなら、純粋でない環境の中で行わなければなりません

<-で束縛する必要があり、=ではダメ。

gist.github.com

I/O アクションの中で let を使う

<- は I/O アクションの結果に名前を束縛したいときに使い、 let 束縛は純粋な式に名前を束縛するのに使います。

mapとかで<-は使えないっていう話。

letarrow.hs

逆順に表示する

  • I/Oアクションの再帰
  • mainの中でmainを使って再帰を繰り返す(戻り値がIOなのでいちおう再帰は出来る。あと、再帰だけどうまいことスタックはどうにかしてくれるんじゃないのかっていう)

gist.github.com

do ブロックで I/O を行うときは、たいてい return を使うことになる。

gist.github.com

8.4 いくつかの便利な I/O 関数

  • putStr
  • putChar
  • print
  • when
  • sequence
  • mapM
  • forever
  • forM

gist.github.com

gist.github.com

gist.github.com

gist.github.com

gist.github.com

gist.github.com

8.5 I/O アクションおさらい

I/OはHaskellの他の値と似ているけど、違うのは、mainの中に入っているとそれが実行されること。実世界から取得してきたものを伝える結果を生成すること。

main関数の再帰、やってみるといいかもしれませんね。他の言語で。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

gistyにPRを投げる

github.com

d.hatena.ne.jp

ファイルをGistに上げるコマンド gistyです。結構便利なのでガリガリ使っていますが、gisty postするとGISTY_DIRにアップしたファイルのディレクトリが出来るんです。ただ、かなりの頻度でgisty postするせいで、GISTY_DIRに大量のディレクトリとファイルが出来るので、なんか消しておきたいなあと思ったのでした。

で、gisty delete_local_allというのを作ったのです。このコマンドをうつことで、GISTY_DIRにあるディレクトリとファイルを消すようにしたのでした。

➜  ~  gisty help
usage:
  gisty commands
commands:
  gisty sync_delete                     sync remote gist. delete local gist if remote gist was deleted
  gisty delete_local_all                delete all local gist
  gisty about                           show about gisty
  gisty help                            show help
  gisty list                            show local list
  gisty pull_all                        pull all gist
  gisty post file1 file2 ...            post new gist
  gisty sync                            sync remote gist (clone all remote gist)
  gisty private_post file1 file2 ...    post new private gist

ただ、PRを出したらTravisCIがコケたので、そこらへんはどうしようかなあという日記です。