今日は「モナド基礎勉強会 vol.2」の日です

名古屋大学で開催されているモナド基礎勉強会 vol.2に来ています。

「圏論の導入、特にモノイダル構造」 / @t6sさん

  • 圏 : (Universeを仮定。有効グラフから)
  • 圏の例 : Set, Hask (とか), モノイド(Objectが一つの圏), poset
  • 関手 : 圏から圏への射。射関数と対象関数。sourceとtargetを保つ。合成とidを移す。lawはDで満たされてるので不要
  • 関手の例 : グラフの圏、Maybe
  • 自然変換 : 関手圏の2-cell。対象から射の関数
  • モノイダル圏 : \(\otimes, 1, \alpha, \lambda, \rho\)
    • これだけだと\(((a \otimes b) \otimes c) \otimes d \simeq a \otimes (b \otimes (c \otimes d))\)の同型が複数になる
    • コヒーレンス定義の話
  • モノイダル圏の例 : \(\mathbb{C}^{\mathbb{C}}\) / strong monoidal

「圏論からみた型の話」@t6sさん

  • モノイド : 集合のモノイド、モノイダル圏のモノイド
    • 直積持ってなくていい
  • モナドは自己関手圏のモノイド
    • scalaはreturnがないっぽい
  • MonadPlus とは? 二重構造で分配則とかある構造
  • モナドが何をしているのか
    • \(a \to Mb\) M は effect
    • bind の定義
  • Free monad → abstract syntax tree
    • Ma は、 a の中の値を使った式たち
    • \(C^M\) M代数の圏 : 評価の仕方がオブジェクト
    • M に syntax がすべて入っていると考える
    • \(C_M\) クライスリ圏
    • モナドで定義された随伴

「モナモナ言うモナド変換子入門」@hiratara

自分のトーク。資料はアップしておいた。

「基礎から学ばないFree Monad」@pocketberserker さん

  • HaskellやScalaの界隈でよく知られている
  • FunctorからMOnadへシングルトン生成とネストの結合の一般化
  • class Functor f, class Monad m, instance Functor f => Monad (Free f)
  • bindの列は左結合時のパフォーマンスが良くない → CPSで解決
  • 中間状態にアクセスするとCPSの利点が損なわれる → Reflection without remorse
    • type aligned sequence
    • Free Monad, Iteratee, LigicT に適用が可能
  • MonadReaderとか定義するのめんどくさい
  • Reflection without Remorse
  • 結合可能キューで実装されているので速い。fmapが重要

「IOモナドを実装してみた」@mzp さん

  • Haskellによるモナドチュートリアルが増えている
  • HaskellといえばIOモナド
  • IOの表現 synchronized stream, continuation, linear logic, side effect
  • dialog : [Response] - > [Request] → 初期のHashkell。定義が簡単。入力を消費しすぎるとまず
  • 継続 : 初期のHaskell。フロー制御しやすい。生の k を扱う。Hugsなど
  • 線形論理による実装 : Haskell。World が複製される問題。複数回使えない型 (*World)
    • ghcで型チェックはしていない。IOモナドで隠蔽されてるので
    • もともとClean
    • 複数の状態 WorldA WorldB を明示的に扱える
    • IOモナドを使って線形型を定義するのは不明
  • 副作用によってIOを表す (サンクを明示すればO.K. )
  • 異なる言語機能をラップして導入できるモナドは便利
  • shelarcyさんの

Yonedaについて / @its_out_of_tune さん

  • Takahashi Monad, Sarasvati (PortAudioのラッパーのラッパー)
  • 米田の補題の証明
    • 共変hom関手
    • \(\mathrm{Hom}_D(r, f) R = f\)
    • \(Y': D \to Set ^{D^{\mathrm{op}}}\) 充満忠実
  • Haskellでの話
    • newtype Yoneda
    • instance Functor (Yoneda f)Functor f と同値
    • 若干のパフォーマンス改善を望める
  • Coyoneda
    • lowerCoYonedaでFunctorが要求される (YOneda は liftYoneda だった)
    • 意味がわからなかった
    • Coyoneda の補題と言われるものが複数あるので、どれか確認する必要があるね
  • Free monad は retract 関数を使えばモナドの代理になる
  • Free monad と CoYonedaを合わせるとOperationalモナドとなる
  • interpret 関数でIOアクションを定義
  • Operationalモナド
    • モナドを作るのはややこしい
    • DSLをつくるためのツール
  • 米田先生すごい

「Schemeによるモナド論文『Semantic Lego』を訳しました」@iHdkzさん

プロジェクタが死亡したため、本トークはスライドなしで。

  • Semantic Lego
  • SICPの続きみたいな言語の実装
    • 導入した機能を壊すたびに実装していっててムカつく
    • waddlerのessential programmingをヒントに実装
    • 言語の意味論として利用
    • monolicic と modular interpreterの話
  • monadは一つの言語のインタプリタ。合成でモナド変換子と持ち上げ
  • 階層化モナド

「Free Applicative Functors」@halcat0x15aさん

  • Applicative とは : pure, <*>
  • 任意のarityの関数に利用可能、Monadより軽量
  • FreeはHaskellでは very well-known なデータ構造
  • Free Applicative : 左結合と右結合で異なるが、同型
  • 例: Option parser。作用が独立しているので解析が可能
  • Applicativeの圏から自己関手の圏への忘却関手の左随伴

「Haskellerのためのオブジェクト指向入門(モナドもあるよ!」@fumievalさん

  • オブジェクトは射。作用に基づいたパラダイム
  • 内部状態、命令、操作、を定義
  • Data.Extensible Lensのアクセサを定義
  • 操作は GADT で定義する
  • メッセージの型とアクションの型
  • @~ と lambda case で作れる。new.-で利用
  • Minecraft風のゲームのデモ
  • 記述量が少ない、合成可能、消滅するものも作れる

Monadなんてどうってことなかった話

LTでした。

  • Monadはただの型クラス
  • do記法がある
  • <-や行間で何かをしてるだけだった
  • 大事なことは大体 >>= でやってる
  • 何もしないreturn、入れ子のdoでも大丈夫
  • みんなちがって、みんないい。ニートでもいい