| 発表場所: | @zakky_dev さん関数型帝国名古屋入国歓迎会 @ 名古屋ギークバー |
|---|---|
| 資料のライセンス: | CC-BY-SA 4.0 |
- なかやん・ゆーき / ぺんぎん / もみあげ
- @pocketberserker / id:pocketberserker
- どこにでもいるふつーの社会人
- Microsoft MVP for F# (2013/04 ~ 2015/03)
- F# / Scala(z) / Haskell / Erlang / C++ に興味あり
https://twitter.com/kyon_mm/status/477002304239853569
- TL眺めてたらHaskellのつぶやきが多いように見えた
- ※個人の日記レベルの感想です
きょんさん「なかやん、何話したい?」
おとーふさん「F#でFree Monadで!」
なかやん「ではそれで」
- そういえばHaskellで一時期Free Monad流行ったよねとか
- (時代は進んでOperationalらしいですが気にしない)
大雑把にいうと
- Functorを持つデータ型をMonadにできる
圏論わかりませんorz
- https://github.com/ekmett/free/blob/bf1298c2e21f70bd0559b267d4d85e21e8948fb9/src/Control/Monad/Free.hs#L103
- https://github.com/ekmett/free/blob/bf1298c2e21f70bd0559b267d4d85e21e8948fb9/src/Control/Monad/Free.hs#L184
- DeriveFunctor拡張を使ってFunctorを生成
分解を試みる
- (<$>) :: Functor f => (a -> b) -> f a -> f b
- 中身のFreeな値を取り出して再びbind
- Pureだったらfを適用
あと、インスタンス宣言をFreeに集約できる。
- http://days2012.scala-lang.org/sites/days2012/files/bjarnason_trampolines.pdf
- http://halcat0x15a.github.io/slide/free/out/
- https://github.com/scalaz/scalaz/blob/88a90089652fb9258885cd3eb53e1ee71cdbcc1c/core/src/main/scala/scalaz/Free.scala#L50
スタックあふれを回避するためにGosubが追加されている
- https://github.com/xuwei-k/free-monad-java/blob/28e8b032862996d1db0b5ed7fc2dcf944a4e613c/free/src/main/java/free/Free.java
- scalazとhighjを参考にして実装したらしい
- ダウンキャスト
- https://github.com/pocketberserker/free-monad-fsharp/blob/605d89105247a26efaed74dcca88eb24ecd78e4b/FSharp.Monad.Free/Free.fs
- free-monad-javaのF#移植版
- 型消去できないのでごまかせない部分が増えた
- 型推論させすぎるとCastInvalidで死ぬことも
- ダウンキャスト
コンピュテーション式をFreeのもの一つに統一できるかも、という壮大な計画があるかもしれない…?
- https://github.com/pocketberserker/free-monad-csharp/blob/50f9d731c96ec389e2955eb6b104a7a6999ef0d9/CSharp.Monad.Free/Free.cs
- free-monad-javaのC#移植版
- 更にごまかせない部分が増えた
- F#で(ry
- 一言でF#erといっても、その方針は様々です
- Coyonedaという存在
- Operational Monad
