2018 11/10
conpass
scala kansai と日程が被っていて「本日の資料です」のハッシュタグが #scala_ks か #HaskellDay か確認するまで気を抜けないw
https://twitter.com/nakaji_dayo/status/1061133670293983232
(途中から参加)
- 層毎にモナドを作って出来ることとか起きるエラーを型で示す、起きるエラーもそれでコンパイルチェックする
本当に一瞬しかコード見えなかった...
class => MonadService m
みたいな...??
- レイヤー設計を型安全にしてる感じ
- swagger 使っていて、ドキュメントが実装と必ずずれない
- database のレコードの型もコンパイルで担保できるらしい
- api 層は repl で叩いて動作確認する
- レイヤーの上端下端、もしくはオニオンの一番外側はそれで担保して、レイヤー内は型とコンパイルで守られる
- 型がヒントになりコードレビューもしやすい
- エラー設計も型っての、マジで良いなぁ...今エラー設計の課題ありすぎるもんなぁ...
- yesod やったときに触った shakespeare template はマジでよかったので信じてる
- タイムラインには elm ってのもちらほら
- servant-swagger
https://twitter.com/syocy/status/1061126091589378048
pdf
- 始めに
- スライドは github にあるよ
- 掲載コードは doctest で担保してるよ
- 参考書は Haskell による並列・並行プログラミング だよ
- simon marlow って ghc の主要開発者だったのか
- haskell 以外の人にもエッセンスがオススメだよ
- トレンド
- シングルスレッド性能は頭打ち
- 論理コア数は増えてる
- 現代の性能にはコア数を活かすプログラミングが必要
- go とか erlang とか rust とかあるけど、haskell だとどうなの?
- ghc は古くから並列並行を考えてるぞ
- haskell の良い特徴
- 副作用を分離出来るので並列性が決定的(並列度や実行環境に依存しない)
- スレッドが軽い
- 単語整理
- 並列: parallel
- 並行: concurrent
- 分散: distributed
- parallel
- 同時に走らせることで高速化したい
- concurrent
- そもそも同時に実行したい
- distributed
- 複数のマシンを使う、マシンが同じとも限らない
- parallel から見て行くよ
- async は async package に入っている
- forkIO の薄いラッパーだけど、async の方が安全なので推奨
- スレッド間通信
- MVar
- シンプル
- アクセスの公平性が保証される
- STM: Software Transactional Memory
- 途中で失敗したらトランザクションのおかげでなかったことに出来る
- 複雑な共有状態の処理をミスなく記述しやすい
- MVar
- サンプルコードの counter へのアクセスは、同時に起きた場合は失敗して勝手に retry してくれる
- haskell は必要になった式を順番に評価していく(遅延評価ってやつ)
- 並列に評価して欲しい箇所を指示できる
- Par Monad
- データフロー並列
- パイプライン並列
- Haxl
- データソースへのクエリを自動的に並列化する
- facebook のスパムフィルタで使われているらしい(シグマ?)
- ThreadScope で実行時システムのログを可視化してくれる
- 前の読書会で使ったやつと同じ
- この本は全てのプログラマが読むべき本の一つ by kazu_yamamoto
- amazon ツイートしてくるのウケるw
- https://twitter.com/kazu_yamamoto/status/1061136742571331585
https://twitter.com/syocy/status/1061126091589378048 (同上)
pdf (同上)
- 設定ファイルってなんだ
- プログラムのパラメータを変えたい、かつソースの外に切り離したい
- けど設定ファイル言語は機能が少ない
- dont repeat yourself が案外守れてない
- 静的検査や型とかない
- 分割や import したい
- 副作用とかつらい
- 無限ループしないで
- そこで Dhall(だーる)
- github (dhall-lang)
- github (dhall-haskell)
- 型
- Bool, Natural, Integer, Double, Text, List, Optional, Record, Union(どれか一つ)
- union は haskeller 的には直和型
- 設定ファイルで直和型って良さそう!
- import
- import は local path か url から出来る
- raw text も可
- 導入できんのか?
- 自分の言語にバインディングがない(現状 haskell のみ)
- yaml や json 使ってるし...
- dhall-to-yaml とか dhall-to-json があるぞ
- Kubernetes の yaml がやべー!
- wall of yaml !
- いろんなソリューションがある
- ってか dhall-kubernetes があるんだけどね
- おまけ
- mac, linux だと haskell いらないけど、dhall ってコマンドが便利(これは haskell 依存)
- dhall format, dhall repl とかある
- 多層関数とか型の型 (kind) も可能(すげぇ...)
- haskell ではそのまま dhall 読めるぞ
- haskell で dhall にビルトイン関数も足せるぞ
- IO ですらも ただし標準ツールが担保してくれる保証はないが
- 事例
x: 1
みたいなマジックナンバー盛り盛りのやばい json があった- なんと独自マクロ文法(!?)があった(json としては文法エラー)
- dhall でそれを作り直したけど、文法エラーを再現するために dhall-to-json を haskell で拡張したwww
- dhall なら invalid な json も書ける!型安全さと自由度を両立www
- 質疑
- 今のやばい json をどうやって dhall 化するの?
- 頑張るしかないなー
- url import 可能って言ってたけど、設定ファイルって普通プライベートじゃない?認証とかどうなってるの?
- 即答できません -> github token とかでいけるらしい?
- 型定義は外から持って来て、値はローカルに書くとか?
- 便利関数集とかが公開されてるので、そういうのにも使える
- dhall-scala もあるっぽいねー
- 今のやばい json をどうやって dhall 化するの?
https://twitter.com/public_ai000ya/status/1061147030058221568
有名人なのか? -> https://twitter.com/public_ai000ya/status/1049124674221694976
ちらほら休憩時間に名前が聞こえる
- 導入
- 推しVim: NeoVim
- 初心者フレンドリーで行くよ
- 標準ライブラリとはちょっと違うことがあるよ
- Magma(亜群)
- 足し算あるいは掛け算が出来る構造
<>
a
に閉じた二項演算である[a]
とかb
とか出てこなくて、2引数である- 閉じていて二項演算なので、
x <> y <> z
と続けられる
- 必ずしもある型に対してマグマの実装は一意ではない
- int の +, * や bool の &&, ||
- Semigroup(半群)
- Magma + 左右どちらから演算しても変わらない
(x <> y) <> z = x <> (y <> z)
- Magma を継承して作る
- Magma だけど Semigroup ではないもの
- double や float は丸め誤差が変わるから
- Monoid(モノイド)
- Semigroup + 単位元
empty
empty <> x = x = x <> empty
- Semigroup だけど Monoid ではないもの
NonEmpty a
とか
- Semigroup + 単位元
- Group(群)
- Monoid + 任意の元に対する逆元
x^-1
x^-1 <> x = empty = x <> x^-1
- Monoid だけど Group ではないもの
- And, Or, Product Integer, Product Rational, [a]
True || inv True == False
のinv
とか[x, y] ++ inv [x, y] == []
のinv
とかが実現できない10 * 1/10 == 1
だけど、1/10
はInteger
ではないし、Rational
だとゼロ除算してしまう
- And, Or, Product Integer, Product Rational, [a]
- Monoid + 任意の元に対する逆元
- Abelian(可換)
- おまけかつ早いので諦め
- Rng(擬環)
(><)
- ↑ こんな顔になってきた...
- Ring(環)
- はやい...
- ちょっと脱線
- みなさん写像は好きですか
- Field(体)
- 宣伝 -> 矢澤にこ先輩といっしょに代数!
@matsubara0507
- 自己紹介
- 趣味 haskeller だし、新卒で最近は haskell ちょっと少なめ(ガチ勢のふいんき)
- 言語学んだら、まぁコマンド作るよね
- コマンドライン引数
- 沢山ある
System.Environment.getArgs
- base にある
- タダの空白区切り
System.Console.GetOpt
- これも base にある
- 特定の型にしてくれる
optparse-applicative
- サブコマンドとか、もっとリッチなのとか
- stack も使ってるよ
- ラッパーも沢山あるよ
- お手製ツール has-hub で使ったやつ
<>
しかしてないんで網羅性チェックが無理3
を見ても1 <> 2
か0 <> 3
かわからないじゃないか- 型安全にしたいじゃんか
- extensible というパッケージを使います
- extensible 攻略 wiki(検索で出辛い)
- RIO
- Prelude
- base の標準インポートされてるやつ
- ある段階まで行ってしまった haskeller はオフりたくなる
- head とか
- そこで RIO
- stack を開発しているチームが開発している
- ベストプラクティスを詰め込んでいる
- text, bytestring, directory, filepath, containers, lens, time, vector 等々
- Prelude
- Stack Template
- やることは大体一緒
- 推しパッケージ入れて、github のアカウント設定して、コマンドライン引数処理書いて...
- なのでオレオレテンプレート作れるよ
- github とかからも取ってこれるよ
- sbt template とまぁ同じだよね
- 世にある template を一覧で探せないので、そんな cli を作ったりしてみたよ
- github-v4 使ってるんだけど、良い感じの graph-ql の型型したのがないので誰か作って
- やることは大体一緒
https://twitter.com/lotz84_/status/1061165681918373890
lotz さん初めて見た!
- 2D を簡単に描画できるライブラリ
- やっぱり型だぜ
line :: [(Float, Float)] -> Picture
とかわかりやすいなー- trans や scale 当然あるぜ
Picture
はMonoid
なので合成出来るよ- 例えば
circle 50 <> rectangleWire 50 50
で一つのPicture
になる
- 例えば
- 二重振り子 を作ってみるよ -> 見たなこれ
- 時間経過も定義できる
- IO も使えるよ
冒頭聞き逃した...
- バイト列に名前を付けて扱えるようにしてみた?
- prompt が... import 長いし string が...
んー、何の話をしているか全くわからんな...(プレゼン的な意味で)
今回のロゴ作った人だったのか! -> https://twitter.com/suzuki_hoge/status/1061181947534180352
プレゼンもイラレw
- した -> https://twitter.com/suzuki_hoge/status/1061182800726913025
- domain modering made functional ってワードで、いくらか調べてみようか...
- F# でしかも英語...
- scala-matsuri もそうだったけど、やったこととかやってみたいと思っていたことを見かける頻度が上がってきた
- api のやつが一番面白かった
- 少し前にモナド変換子モリモリでレイヤー設計したけど、レイヤー毎にモナドを自分で作るって発想はなかったな
- スキルが全然足らない
- おもしろいけど、不安になる
- 物足りないなー...