haskell-jp / icfp #2

ループができるのはもともとそうなってるのか
今回特有のことじゃないのかな
Working with Source Plugins

文字通りSource Pluginsの作り方や例などの紹介
https://qiita.com/waddlaw/items/65b57517f105fcbbe724
と大体同じ内容かな... 作り方がちょっと詳しかった?
(実況めっちゃ助かります!!)
HIWのKeynote:
Haskell Use and Abuse at Scale

Google XはめっちゃHaskell使ってるよ、という話。
Coding Styleの無さとか、簡単にスペースリークするコードが書けるとか、改善するためにいろいろできちゃうこととか、心当たりのありすぎるHaskellのつらみが挙げられててつらい :disappointed:

Locally briliiant globally incoherent. :naruhodo:
Haskell採用、やっぱりいかにfancyな機能(各種GHC拡張なりLensなどの汎用性の高いライブラリーなり)の使用を絞るかにかかってる気がするなぁ。誰かがかちっと決めないと。
LTで紹介するexampleに致命的なバグがあったので直してたんであんま聞けなかったけど、めっちゃ質問時間も盛り上がってて追いつけてないのつらい
Haskell書きたがる人はbrilliantなことをしたがる、か... :cold_sweat:
LT応募したぞ!参加者が多いのか、5分に縮められてる :cold_sweat:
GHC 拡張70以上はやすぎでしょ感
Matthew Pickering、昨日から続けて3連続発表 :serval:
Configuration, but without CPP
CPP の #ifdef の問題点が示されてる
ifdef の分岐で型が一致してなかったり検出できない
「2回目参加するんだったらなんか発表して、少なくとも応募して」とkazuさんから言われてるので... :sweat_smile:
まぁ、それでなくともLTならいけそう、と去年思ったからだけども。
choice type の紹介
D<Int, String>
プログラム全体で左なら左が選ばれる
すごい実践的な話かと思いきや割と理論的な話だった。
CPPに代わる条件付きコンパイルを検討して、どうやってそれを型チェックするか、みたいな話。
choice typeはそのためのkey idea
HIE files in GHC 8.8
コンパイルできないとコードのセマンティクスが取得できないこと etc. が問題
hiedb コマンドが提供されるのかな
hie ファイルのデータをそれで問い合わせができるっぽい
参照先へのジャンプだけじゃなくて、参照箇所の検出も出来るっぽいな。
hie-lsp: Language Server
hie-lsif: Convert in Language Server Index Format for GitHub's online code navigation.
Make CI server use it.
Future:
Type classnインスタンスがどう解決されたかも出す。
定義ジャンプしたとき実装に飛べるようにする
Tagging Tags: Inferring the presence of pointer tags at compile time.

現状はStrictなフィールドかどうかにかかわらず参照時にindirectionが発生するので、それを静的に検出してどういい感じに最適化するか、という話らしい
(OverloadedStrings とかいい加減デフォルトでも良さそう)
いやー、実際通るべきところでambiguous typeが発生したりして結構うっとうしいかなーと思うときはありますね...
LT終了。案の定時間切れ :disappointed:
MatthewさんLTもやるのか... :open_mouth:
Monad Transformers and Modular Algebraic Effects: What Binds Them Together
Status Update on the Helium for Haskell compiler
https://github.com/Helium4Haskell/helium

エラーメッセージをわかりやすくして、プログラミングを初めてやる人でも使いやすくすることを目指したHelium。
DSLを作ったときにDSL向けのエラーメッセージを作ることも出来る。
当初型クラスのないHaskell 98であったが、リリース予定のver. 1.9で実装される。
monad transformers と modular algebraic effects との対比
mt → mae への変換またその逆のときにどういう手法があって、構成する要素がどう対応しているか
mt と mae だと mt の方が大きいので mt → mae は何でもできるわけではない( catchlocal は mae にならない
Scoping Monadic Relational Database Queries
The Gibbon Compiler: Accelerating a small subset of Haskell
https://github.com/iu-parfunc/gibbon/tree/master/gibbon-compiler

最適化の実験のために作られたコンパイラー。Haskellのサブセットが対象。
TreeやListなどのポインターによるアクセスを前提とするデータ構造を、処理する関数がどのような順番でアクセスしているかを見て自動でpacked arrayに変換する、という特殊な最適化をサポートする。
将来的には Packed という型クラスでpacked arrayに変換する仕組みを提供することで、Haskell本体(GHC?)に統合することを目指す。
今年のHIW、いろんなHaskell Compilerが出てきて面白い(去年はGHCの話が多かった
発表内容と関係ないけど、スライドを上下に分けて、1つ前のページと今のページと片方ずつ進んでいくの見やすい
SELECT a, b
FROM
  table0
    LEFT JOIN
      (SELECT b FROM table1 WHERE colA0 == colB1)

というような SQL があるとき colA0 が table0 のカラムだとエラーになる。
単純なモナドベース EDSL だと型エラーにできない。
型関数などを使って型エラーにすることができた。
do
  colA0 :*: colA1 <- from table0
  leftJoin $ do
    colB0 :*: colB1 <- from table1
    ristrice $ colA0 .== colB1

みたいな EDSL
ON 句が抜けたか
Copilot 3.0: a Haskell runtime verification framework for UAVs

Cのソースを吐くHaskell製EDSL。runtime verificationが組み込まれたソースが吐かれるんだろうか。
関連: https://haskell-jp.slack.com/archives/C4M4TT8JJ/p1554850965072300
HoleFitPlugins and the future of interactive development in GHC
type hole で提案が出てくるけど、その提案を出す部分をコンパイラープラグインにしよう(もうなってる?)という紹介っぽい
_で始まる識別子を書き換えるでどのようにcandidateを探すか指定できる
開発中のドキュメントに書いてあるものだし、まだ出てないんじゃないかな
対象を検索するための構文を拡張しよう!というプランも
    g :: [a] -> [[a]]
    g = _{hoogleLookup "+Control.Applicative"}
Liquid Haskell の refinement type の条件を書いてそれに合うものだけ提案してもらうとかも