haskell

いってきた: 秘密結社Metasepi作戦会議 #1

今日はとても温かな天気。もう春のよう。

手伝えるところはないので行くかどうか直前まで悩んだあげく行って後悔するほうがましというストラテジでいってきた。

DSC04006DSC04008

DSC04009DSC04011DSC04012DSC04014DSC04015DSC04021DSC04018DSC04026DSC04025DSC04024

DSC04022

DSC04023

DSC04043DSC04027DSC04028DSC04029DSC04030DSC04031DSC04032DSC04033DSC04038BlogPaint
DSC04042

おそくなったので会社にとまる。

DSC04044

いってきた: 第7回 スタートHaskell2 (最終回)

午前中に軽く泳いでから電車に飛び乗って神保町へ。まったく予習していかなかったから(予想どおり)話がさっぱりわからなかった。

6c2d11b1.jpgDSC03795

DSC03797

第14章 もうちょっとだけモナド / @ffu_DSC03794

  • https://speakerdeck.com/fujimura/moutiyotutodakemonado
  • 差分リストの「差分」はProlog用語で差分で管理されてたが仕組みはあとかたもない。
    • 右結合になるというのはちょっとちがう.. (kazu)
    • 最近はプレイズビルダーをつかう。TextやByteString。差分リストはつかわれていない。継続をつかっている。
    • http://mew.org/~kazu/material/2012-builder.pdf
  • Reader: configファイルのよみこみは命令型だったらグローバル変数にしちゃうよね (kazu)
    • 関数型なら引数を1つふやすだけだが、モナドにして地下配線にしちゃうとすっきり (kazu)
  • Q: ネストしたMaybeができてしまうのはなぜ? (kazu)
  • A: DBの結果がMaybe、Parseした結果がMaybeなってるときに。
    • >>= をつかってればjoinはいらないはず。圏論的にはモナドはjoinで定義されてるらしい。(kazu)

[2013-01-20 13:50]

補足: 例題で比較する状態系のモナド / @kazu_yamamoto

[2013-01-20 14:03]

第15章 Zipper / @shokosDSC03798

[2013-01-20 14:23]

LT @master_qDSC03799

  • metasepiの紹介
    • http://metasepi.masterq.net/
    • NetBSDをHaskellで実装しようというプロジェクト。
    • OSSをつかった社内開発: OSS本家の開発工数は社内でつかえる開発工数に比べるとでかいのでマージで死ぬ。
    • POSIX APIきらいだけど、上に乗ってるアプリはつかいたい。
    • スナッチ: http://ja.wikipedia.org/wiki/スナッチャー
    • jhcをつかうとstandaloneのC(libcなしで動く)が生成できる。
    • 過去プロジェクトの失敗。スクラッチで書くのは無謀。既存のモノリシックカーネルを元にするけど型は全部IOになっちゃうやろ。
    • bootloaderでMapつかっても60kBくらいにかならない。リッチにいこう。
    • https://www.youtube.com/watch?v=3Z-c6nhDBw8
  • 簡約!λ力娘の紹介

DSC03802DSC03803DSC03805DSC03806DSC03807

[2013-01-20 15:05]

休憩 〜15:30

菓子パンもぐもぐ

DSC03808

演習タイムDSC03810

[2013-01-20 15:33]

Writerモナドを使ってみようDSC03811

  • 「計算の部分は純粋にした方がよかったかも」

DSC03812

[2013-01-20 16:36]

Stateモナドを使ってみよう

DSC03815

[2013-01-20 16:43]

EitherモナドDSC03818

DSC03817

[2013-01-20 17:09]

DSC03816

LT: Hakyll改造で快適なブログ編集 / @kei_qDSC03820

  • 趣味でhaskellをやっている。
  • markdown/literate haskellなどからhtml/rssを生成するツール。
  • ブラウザが勝手にリロードしてほしい。
  • livereload拡張をwebsocketでつっついている?
  • https://www.youtube.com/watch?v=4AVRDCm2FPY

[2013-01-20 17:20]

  • Hakyllの作者は彼女にふられていま日本にいるらしい。
  • localでwebsocketという発想

[2013-01-20 17:25]

LT: @kazu_yamamoto

LT: 品川でゆるいフットサル

  • 抽選で月2回くらいあたる。
  • 次は 1/26, 2/3 10:00〜12:00

LT: mrubyの夕べ

  • 1/28 17:00〜19:20

LT: 永続スプレー木と永続スプレーヒープDSC03825

  • スプーレ木は二分探索木。
  • アクセスするたびにその要素がルートになり動的バランスされる。
  • 永続木構造だと親へのリンクはない → Zipperをつかえばok.
  • パターンマッチでzig zagをボトムアップを実装できる。
  • スプレー木はトップダウンがいい → Zipperいらなかった...

[2013-01-20 17:40]

@seizansさんと@Lost_dog_さんの挨拶で終了。

DSC03826DSC03827

[2013-01-20 17:43]

感想: スタートHaskell2はスタートHaskellと比べてずっと難しかった。完全に挫折。

外に出ると月のまわりに虹ができてた(あとで調べると光環というらしい)が写真で撮るには露出差が大きすぎて写らず。

DSC03832

電車空いてるなぁとおもいつつ、きんつばをたべながら帰宅。

22b8b4bf.jpg

いってきた: 第6回 スタートHaskell2

当日の朝までかかってアプリカティブ章とモノイド章まで読んだけどモナド章は間に合わず。あかるくなった空をみとどけ布団で4時間寝て会場へgo!

K3410703K3410704K3410706K3410707DSC01722 (1)

DSC01724DSC01726DSC01728DSC01730DSC01732

最後尾に陣取って昼飯。

DSC01733

諸注意DSC01734DSC01735

  • この会場はじめての人も何人か。
  • 近くの自販機にはcoldしかないよ。
  • テザリング禁止

DSC01737

[2012-11-18 13:03]

第12章 モノイド / @apstndb DSC01738

  • http://www.slideshare.net/ShintaHatatani/h-12-15228437
  • newtypeだとコンパイル時のオーバヘッドしかない
  • dataでつくった型コンストラクタだと使われなくてもコンストラクタ呼びだしを確定させるために引数の型を早く調べる?
  • mappendは <> がつかえるようになった (GHC)
  • たたみこみのためにmemptyは必要。
  • Num aはクラスなので型じゃないのでListやBoolと同列にitemizeするとちょっとおかしい。(kazu)

[2012-11-18 13:50]

  • Q: mappendの順番が重要だが、Monoidの性質によるはず?
  • A: 左たたみこみの定義をそうするか?リストにしてからfoldrした結果と同じになるようにすべきらしい。
    • 深さ優先探索でもpreorder,inorder,postorderがあるうちの1つを選んだだけにすぎない。(kazu)
    • p279の「mappend..順序にさりげない配慮が光ります」は誤訳かも?原書にはなさそう。村主さんがノリで書いた?(kazu)
    • 回答→ https://twitter.com/kazu_yamamoto/statuses/270790404889251840

[2012-11-18 14:02]

[2012-11-18 14:03]

あなたの知らないMonoidの世界 / @kazu_yamamoto DSC01740

  • http://mew.org/~kazu/material/2012-monoid.pdfa
  • みなさんは群って聞いたことありますよね?
  • まわりはMonoidだらけ
  • 半環はすごい。
  • この本を読んだだけでは、おれはモノイドはつかわねぇ、っておもいますよね?
  • doctestでテストの結果を集計したい。でも単に足し算したいだけじゃね?
  • Numじゃないとダメな理由 → かけ算割り算はいらない、足し算だけでいい。
  • tanakhさんが、とつぜんFizzBuzzに割り算はいらないといいだした。 → やりすぎなMonoidなFizzBuzzができた。
  • <>は別名なので定義のときは mappend を書かないといけない。
  • Monoidで実装して試験官を困らせよう。
  • プログラム自体もMonoid。プログラム自体をデータとしてあつかえるのもMonoidを操作しているだけ。
  • mappendで連結系はlist,Sum、選択系はMaybe。
  • AlternativeとMonadPusの(<>)とmplusは同じ関数シグネチャ。MonadPlusはいらない子(Alternativeをつかえ)。Monadの制約が必要になって強すぎる。
  • コンテナにかぎっては連結している感じは必要なくて選択する感じだけでよい。

[2012-11-18 14:19]

[2012-11-18 14:20]

第13章 モナドがいっぱい / @brain_apple DSC01741

  • http://www.slideshare.net/KentaSato/ss-15225450
  • 「生物系なのになんでモナドの紹介してんだろ」
  • モナドチュートリアルが無限に増えつづける.. また1つ増えます..
  • returnとpureはおなじ型
  • 引数の順番を変えると第2引数が違うだけ
    • Functor: (a -> b)、 Applicative: f (a->b)、 Monad: (a -> m b)
    • bindを説明するためにあえて
  • Functor/Applicativeでは、コンテキスト値をみてJust/Nothingかどうか判断することはできない.
    • <$>は値をいじるだけ
    • <*>は文脈のなかの値をいじるだけ
    • >>=は文脈を変えられる
  • リストモナドをつかうと複数の候補がある計算を自然に書ける。
  • 「MonadPlus いならい子 書いてあったので紹介します」
    • mzeroは失敗、mplusは選択。
  • MonadPlus m => は Monad m,Alternative m =>と 書けるが、歴史的経緯でグシャっとなってる。
    • そのときはmzeroはmemptyに
  • guardはリスト内包表記でつかう。
  • 型を書いてたら「これモナドじゃん!」て気づくとがおおいらしい

[2012-11-18 15:03]

  • Q: typeclasspediaはよめる?
  • A: 型クラスってこういう構造をもってるんだぁとかわかって全体像がわかる。
    • typeclasspediaを書いた人は圏論の専門家ではない (kazu)

DSC01742DSC01745

[2012-11-18 15:05]

休憩 DSC01746

  • undefinedはふつうはつかわない (kazu)
    • undefindはnull pointerとはちがう。
    • 関数を未定義状態にしてコンパイルをとおすためにつかう。
    • あとlazyになってるかどうかチェックするのにつかったり。
    • CoolBoolの例はnewtypeだと hellowMe (CoolBool _) は helloMe _ になる。dataでも helloMe (CoolBool undefined) だと例外は投げられない。
% cat -n foo.hs
     1  data A a = A1 a deriving (Show)
     2  newtype B b = B1 { getB :: b } deriving (Show)
     3  fa (A1 _) = "A"
     4  fb (B1 _) = "B"
% ghci foo.hs
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( foo.hs, interpreted )
Ok, modules loaded: Main.
*Main> fa (A1 1)
"A"
*Main> fb (B1 1)
"B"
*Main> fb undefined
"B"
*Main> fa undefined
"*** Exception: Prelude.undefined
*Main> fa (A1 undefined)
"A"
*Main>

[2012-11-18 15:32]

モナモナ言わないモナド入門」第二版 / @kazu_yamamoto DSC01747DSC01748

  • http://mew.org/~kazu/material/2012-monad.pdf
  • 前回のスタートHaskellの改訂版
  • 「テストでモナドとは言語内DSLという回答があったら満点をあげたい」
  • 数学屋だと「具体的すぎてわかりません。抽象化してださい。」っていわれるけど、ふつうの人は具体的じゃないとわからない。
  • すごいH本にはパーサーの例がでてこないけど、プログラミングHaskellでは1章つかって説明があった..
  • ランタイムはrunIO main worldを実行している。
  • 抽象化オタクは抽象化するメリットは言わない。抽象化するのが目的だから!
  • 木の探索で失敗系をあつかうのに手続き型ならバックトラックを実装するがHaskellなら遅延評価があるので「全部とってこい」と書ける。
  • コンテナ: Programmable m, wrapとbindをもつ。
    • 失敗系でもdoがつかえる。
  • 文脈という言葉をつかうのをやめた。つっこまれることあおおいので。これからはDSL。
  • Q: Nothingが途中できたら止まる?
  • A: `lookup`が連鎖すると左結合なので最後までいっちゃうけど、コンパイラの最適化で右結合になるらしい? 途中離脱するには右結合になってないといけない。
  • [強] プログラム可能コンテナ>>= ←→ 逐次コンテナ<*>,return ←→ マップ可能コンテナ<$> [弱]
  • チューリング完全: 逐次・分岐・反復があればアルゴリズムは実現できる。書き易さのちがいはあっても力はおなじ。
  • 「mapがわからない人は関数型言語はやめた方がいい」
  • <$>: 関数をDSLに持ち上げる(lift)、という。
    • (+) <$> [1,2,3] → [(1+),(2+),(3+)] になる(表示できないけど)
  • <*>はアプと読む。
  • pureってみんなつかわないからreturnってする。
  • <*>は2引数なので再帰が書けて、<*>で反復と逐次が書ける。1引数で再帰を書くと単なる無限ループ。分岐は >>=
  • Control.Monadでwhenがつかえる。
  • 糖衣構文のdoがMonadを特殊にしている。
  • >>はゼンと読む。
  • ParserはApplicativeで書ける。書けなかったら設計がおかしい。
  • Maybeでdoをつかうかどうかは宗教戦争。連鎖だからdoを使わない派(kazu)
  • Functorは↓と書けるのが重要。この様式が重要:
do args <- getArgs
   let args' = checkArgs args
↓
do args <- checkArgs <$> getArgs

DSC01761

  • Q: Applicativeが安全とは?
  • A: 力が弱いので分岐とかしてないぞと分かる。文脈依存なパーサーはほとんどなくてプリプロセッサを通すのがほとんど。ApplicateiveならBNFだが、逆はなりたたない。
  • Haskellの内包表記はリストに制限されていているのでリスト内包表記。(昔はモナド内包表記といっていた)。Miranda譲り。
  • Haskellの仕様は2年おきに改訂?
  • LINQみたいなことをHaskellでやりたいのでモナド内包表記がカンバックするかも。

[2012-11-18 16:53]

DSC01754DSC01759DSC01760

DSC01756

「おめでとうございます」by @seizans

[2012-11-18 16:56]

LT: モナモナ言うモナド入門.tar.gz / @hiratara DSC01763

[2012-11-18 17:03]

  • 自己関手圏のモノイドならMonad.
  • ここでは数学でいうところのモナドの話をした
  • 理解するにはいろいろな本を読むしかない... 日本語の本はほとんどない...
  • 理解するメリットは? → 抽象化オタクになれます!
  • Haskellの中だと自己関手しかありえない。
  • 関手とは型と関数という理解で、だいたいok。

DSC01762DSC01764

[2012-11-18 17:10]

LT: Haskell advent calendarの宣伝 / @Lost_dog_ DSC01767

DSC01766

[2012-11-18 17:12]

LT: ゆるいフットサルの宣伝 / @kazu_yamamoto

[2012-11-18 17:14]

LT: C83 λカ娘の販促にやってきました / @master_q DSC01771

DSC01770DSC01772DSC01773DSC01774DSC01775DSC01776DSC01777DSC01778DSC01779DSC01780DSC01781DSC01782DSC01783DSC01784DSC01785DSC01786DSC01787

[2012-11-18 17:31]

LT: モナド則補足 / @kazu_yamamoto DSC01789

  • >=> なんちゃら結合演算子
  • モナド則はモノイドのようであってほしいとの願い。

DSC01788DSC01790DSC01791DSC01792DSC01793DSC01794DSC01795DSC01796DSC01797

[2012-11-18 17:40]

次回(最終回)

  • 1/19土曜の予定

いってきた: 第5回 スタートHaskell2

  • マックで昼飯。どっかのダディが大量注文かまして後ろに行列ができてた。

ad12f59f.jpg

  • ビルに到着したが早すぎたか人気なし。

b76acc60.jpg

DSC09815

  • 会場説明など

DSC09821DSC09823

[2012-10-13 13:05]DSC09824DSC09818

第10章 関数型問題解決法 / @dekokun

DSC09825DSC09826DSC09827DSC09828DSC09829

[2012-10-13 13:53]

DSC09830DSC09831

第11章 ファンクターからアプリカティブファンクターへ / @UsrNameu1

  • http://www.slideshare.net/UsrNameu1/applicative-functor
  • 物理専攻だった、趣味は登山と囲碁、
  • ファンクター: map overできる型クラス
    • class Functor f where
    • fmap :: (a -> b) -> f a -> f b
    • fは型コンストラクタで(:k fで *->* を返す)
    • fmapは箱の中身をいれかえるもの。
  • 文脈: computational context
    • ファンクターを箱ととらえるのか文脈としてとらえるのか...
  • (->)は2つの型をとって関数を返す型コンストラクタ。
  • lifting:視点をかえたみかた
  • ファンクター則
    • 1. 恒等関数の保存: fmap id (f a) = id (f a)
    • 2. 合成関数の分配: fmap (g . h) (f a) = fmap g (fmap h (f a))
    • 圏論とかの数学的要求に従うために必要
    • 「fmapを先に出してからファンクター則を出してくる本の流れはどうなのか?」
    • かずさん
      • 〜則は知らない方がいい。作る人は〜則に従って作らないといけないけど、使う人(入門書)には書く必要がない。
      • "a==b かつ b==c なら a==c" みたいな、あたりまえなことを形式化すると気になってしまう。
      • 定義が与えられた方が分かる人と、具体例じゃないと分からない人と、
      • Maybeのfmapは失敗しない全域関数を失敗しうる関数にliftする。
      • Maybeの文脈は「失敗するかもしれない」
      • IOもParserもファンクターだけど、両者は混ざらない。(レゴ社のレゴはレゴ社のレゴとしかくっつかない)
      • ファンクターの使い道はIOで無駄な変数が変数が減ること! (let line <- fmap reverse getLine のところ) これだけ覚えてください!
      • line <- reverse <$> getLine と書くのが流行。 (<$> == `fmap`) こう使うんだというのが重要。
  • 文脈のなかに入ってしまった値を取り出す一般的な方法はない。
    • かずさん: 箱のなかの値はパターンマッチでとりだせる。でもデータコンストラクタがexportされてないと取り出せない。IOはexportされてない。(一般用語だと:抽象データ型は値をとりだせない。)
  • かずさん: リストは構文糖衣が多い。
  • アプリカティブ則: pure f <*> x = fmap f x

DSC09832DSC09833DSC09834DSC09835DSC09836DSC09837DSC09838DSC09839DSC09840DSC09841DSC09842DSC09843

[2012-10-13 15:11]

(一旦休憩)

(テザリング禁止:APがいっぱい立ってる〜)

  • ひびのさん: スタックオーバーフローはパターンマッチとか関数の引数があやしい。組み込みの+は別。Haskellはlazy thunkがむつかしい。
  • 小銭なく、自販機でジュースが買えなかったorz

DSC09844DSC09848

DSC09847

[2012-10-13 15:36]

(発表のつづき)

  • liftA2意外にもいろいろ便利そうな関数はある(haskell.org)
  • 記号だらけのコードをグレードアップできるよ。

DSC09849DSC09850DSC09851DSC09852

[2012-10-13 15:52]

  • かずさん:
    • liftA2は知らなくてもいい(applicativeスタイルがないときのもの)。数字ものは数字が途中で打ち切られてしまう。liftMとかも忘れて。
    • sequenceはモナド、sequenceAはアプリカティブ。分かれているのは歴史的経緯。sequenceはリストしかとれない。文脈の内側と外側を入れ替えるもの。 → Data.traversable http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Traversable.html

[2012-10-13 15:58]

[2012-10-13 16:00]DSC09854

演習タイム

ファンクターを使って書き直す 次のコードをファンクターを使って書き直してみよう / @copippyDSC09855

DSC09858DSC09859

YukiさんDSC09860

  • かずさん: applicativeは逐次実行を簡潔に書く方法。
  • ひびのさん: 引数の順序とIOの順序が違うときにはつかえないので注意。

DSC09866DSC09867DSC09868DSC09869DSC09870DSC09871

むりやりアプリカティブスタイルにDSC09874

DSC09875DSC09876DSC09877DSC09878DSC09879

パーサーのはなしDSC09881

[2012-10-13 17:33]

LTコーナー

Offline Hoogleで何処でもはすはす / Kiwamu OkabeDSC09888

DSC09890DSC09891DSC09892DSC09893

[2012-10-13 17:41]

HaskellとScala / @xuwei_k DSC09896

  • http://xuwei-k.github.com/slides/haskell_scala/
  • scalaをつかって仕事してたことがあった。無職。
  • 「すからつかったことがあるひと〜」 けっこう手が挙がった。1/3〜1/2くらい?
  • implicitは型クラスのための構文
    • implicit def → instance
  • scalazにいろんな型クラスの定義がある。(標準ライブラリにはほとんどない)
  • ekmett?
  • ☆もちゃんとした演算子。なんとなくじゃなくて数学のなんとかスターに由来。でも不評らしい。

[2012-10-13 17:56]

Haskellはじめました / @seizansDSC09902

  • Haskellを仕事で書いてもらう.
  • HaskellでAWS → aws-sdk
  • 部署の25%くらいがHaskellの読み書き可能
  • javaだと1日3APIくらいのところが10APIくらい書けた、らしい。
    • やっぱパーサー書くのは早いよね。

DSC09904DSC09905DSC09906DSC09907DSC09908DSC09907DSC09908

[2012-10-13 18:04]

フットサル / @kazu_yamamoto

  • 前回参加者 12名 (うち女性2名)
    • 1人100円
  • 「品川でゆるいフットサル」でぐぐって

DSC09909DSC09912

[2012-10-13 18:08]

その後、懇親会がインド屋で行われたらしい。

DSC09915

いってきた: 第4回 スタートHaskell2

新宿駅西口からとぼとぼ歩いていく。東京医大や西新宿駅よりも先ででっかい交差点よりも手前というあいまいな記憶だけでビル名をおぼえてなかったので間違ってとなりの新宿グランドタワーに入ってしまったがローソンがないし17FがNIFTYになってないので違うことに気付いて無事ターゲットに到着。時間ぎりぎりに着くかとおもってたが12:30に到着。徒歩15分くらいか。あつい。

DSC08378DSC08379DSC08380DSC08381

NIFTYの方の先導で会場入り。第1陣。名刺が必要なのをすっかり忘れていたが財布の中に1枚だけはいっててたすかった。床コンセントは豊富にあるので後ろの方に席を確保してラウンジで昼飯。見晴らししいいなぁ。

DSC08382DSC08383DSC08384

フットサル募集 DSC08385

[2012-09-09 13:07]

Haskellを浮上にする魔法たち / 山本悠滋 @igrep DSC08387

[2012-09-09 13:24]

[2012-09-09 13:26]

もっと入力、もっと出力 / @mizu_tama DSC08390

DSC08391

[2012-09-09 14:31]

  • ほそく: 遅延IOは好き嫌いが分かれて純粋な文脈で走ってるのに例外がとんできたりで嫌なことも。エグい。
  • 大御所田中さんからのコメントは?と会場全体が後ろを振り向くと、雰囲気を察知して昼寝から目覚めたところだったの図。

DSC08393

[2012-09-09 14:38]

[2012-09-09 14:40]

休憩

  • 田中さんに質問:
    • Q: getContentの例で1行ごとに表示されるのはなぜか?
    • A: たぶんバッファリング、Hugsだと1文字ごとに出てくる。

おやつの菓子パンぱくぱく。

DSC08394

[2012-09-09 15:30]

演習発表

[2012-09-09 17:38]

LT: Haskell golfへのおさそい / 大川徳之 @notogawa DSC08413

  • http://www.slideshare.net/notogawa/haskell-golf-intro
  • haskellerではない。haskell golfer。
  • code golf = short coding。
  • haskellゴルフ場はあまりおおくない: anarchy golf, AtCoder
  • パズルや制限プレイの感覚とおなじ。
  • 抽象的に問題をみられると短かくなりやすい。短かくなってもわかりやすい。
  • 長い文字列をつかいたくないので、importなんちゃらを避ける傾向になるのでモダンなパッケージをつかえなくなる危険性が。
  • IOができるようになるまでLTを今日まで待ったんだぜ!
  • goruby: ゴルフ専用言語でhallo,worldが1バイトでだせる。 (0バイトはうけつけないらしい)

[2012-09-09 17:58]

終了DSC08414

懇親会は焼き肉らしい。

[2012-09-09 17:59]

記事検索
月別アーカイブ
アクセスカウンター

    タグ絞り込み検索
    ギャラリー
    • 今日の練習 2018-11-15
    • 今日の練習 2018-11-15
    • 今日の練習 2018-11-13
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-10
    Amazon
    楽天市場
    adby google
    LINE読者登録QRコード
    LINE読者登録QRコード
    • ライブドアブログ