GHC 8.x 勉強会に行ってきた
本記事は Haskell (その2) Advent Calendar 2018 の18日目の記事です. 空いていたのでついでに埋めました.
12/7 の10-17時半ぐらいに IIJ-II で GHC8 系のバージョンアップを追う会的なイベントが企画されました. このイベントは IIJ-II の Haskell チームで発案・企画し,Haskell-jp の Slack で募集をかけていました. 定員12人かつ,平日昼間でしたが,面白そうなので有給とって行ってきた(僕は IIJ-II では無いので). 多少クローズドな会ということもあり,せっかくなので色々と議論したことを記事に起こしておきます. 正確な情報は GHC のドキュメントを呼んでください.
進め方
GHCにはこんな感じのリリースノートがある. 当日は8系のリリースノートのハイライトを追っていくという感じだった.
事前に一人一つぐらいは調べてきて発表する感じだったが,担当者がいない内容でも,紹介記事を引っ張ってきたりなんだりしてた.
8.0
リリースノートはこれ. 8.0だけめっちゃ多い. 当初は 7.12 とかにする予定だったが,あまりにも差分があったので 8 にした的な話があるとかないとか(要出典).
TypeInType など
TypeInType
言語拡張について- 以下3つの言語拡張も包含している
- PolyKinds
- DataKinds
- KindSignatures
- PolyKind: 型変数のカインドが多相的になる(本来は
*
) - DataKinds: 定義した型をカインドとして利用できる
- KindSignatures: カインドを明示的に指定できる
- TypeInType:
- 上記全部を利用可
- 多相カインド
- RankNTypes も追加で高階カインドも可能
- Q: 結局目指すところは?
- Dependent Haskell のマイルストーンの一部では?
- Merging Types and Kinds
PatternSynonyms 系
- Record Pattern Synonyms をサポート
- レコード型でも PatternSynonyms を利用
- PatternSynonymsのススメ - あどけない話
- そもそも PatternSynonyms って?
- PatternSynonyms それ自体は 7.8.1 から
- 8.0 から export 時に
pattern
キーワードがいらなくなった- すごい助かるって意見もあれば
- あえて明示的にすべきという意見も
- ネットワーク屋さん的にはこのパターンは本当に便利という話
- BangPattern や ViewPattern の組み合わせ
DeriveAnyClass
- DeriveAnyClass 言語拡張について
- 名前の通り任意の型クラスに対して
deriving
を利用する仕組みを提供 deriving
可能な型クラスからデフォルト実装を定義したり
Injective type families
TypeFamilyDependencies
言語拡張について- 型族が単射だと嬉しい理由 - Qiita
- (書いた当人は書いてたこと忘れてた笑)
ApplicativeDo
ApplicativeDo
言語拡張について- do 記法が Applicative でも使える
- だけじゃなく,do 記法が特定の条件を満たすと勝手に Applicative や Functor に脱糖してくれる
- この条件がなかなか(笑)
なんか結構盛り上がった(笑)
Wildcards in data and type family
この辺り? ちょっと何話したか忘れた.
Strict 系
Strict
言語拡張について- Strict Haskell - あどけない話
- 昔から正格評価にする記法はあったが,この拡張によりデフォルトの評価戦略を切り替えれる.
- 実は逆に
~x
とすることでx
を遅延評価できる - Q: パターンマッチの反駁不能パターンはどうなるんだろ?
~(~x)
のようにチルダをカッコで重ねる
Duplicate record fields
- 重複したフィールドラベル - あどけない話
- Q:
instance (a ~ Int) => IsLabel "same" (Foo -> a)
のa ~ Int
はなぜ必要か?IsLabel "same" (Foo -> Int)
ではなく- 推論の順番を明示的にする
- Q: ボイラーテンプレートの件は進んだの??
- なんか放置されてる
- SystemF + レコード多相は死ぬ
- OCaml は分けている
ユーザ定義 TypeError
- 型エラーをユーザーで定義できる?
- プロポーザル
- どんな話したか忘れました,すいません
GHCi 関連
- 本来 GHCi はコードを同一のプロセスと共通のヒープで実行する
- それを
fexternal-interpreter
オプションでコントロールできる - だっけか(また細かい話は忘れました,すいません)
8.2
- Typeable mechanism, Type.Reflection
- そういえばCUIがカラフルになったね
- Heap 系
- あんまりよく覚えてないごめんなさい
DerivingStrategies
DerivingStrategies
言語拡張について- Commentary/Compiler/DerivingStrategies – GHC
- kakkun 氏の資料
deriving
する時にnewtype
やstock
などのキーワードを指定することでderiving
の仕方をコントロールできる
UnboxedSums
UnboxedSums
言語拡張について- maoe 氏の資料
Compact Regions
- ezyang/compact - GitHub
- 処理系によってGCされないデータ領域
- インターフェースは充実してる
- ただしデータの追加しかできない(書き換えは不可)
- Q: 何に使える?
- 強大な辞書とか?
- 設定ファイルとか?(巨大なら)
- NGワード集とか?
GHC8.x 勉強会のあとに記事にしてくれた:
Backpack
- Backpack – GHC
- 雑にいうと: ML系のファンクターのようなより強力なモジュールシステム
- モジュールのインターフェースと実装を分離できる
- Haskell Backpack 覚え書き - ひげメモ
- 自分の記事だけど1年近く前で覚えてない(笑)
- Q: どんな時に有用?
- 本質的には型クラスと同じ用途のはず
- ただし型に依存しない(型クラスは型によって実装をディスパッチ)
- 不自然な
Proxy a
を渡さなくていい(苦肉の策でそういう実装をしている型クラスがある)
- そういえば最近 contains の Backpack 版がでた
作者さんが忙しくて Stack への適用を断念したため,なかなか浸透しない. 今「Stack への適用をやりたい」という人が現れたが時間がかかりそう.
脱線: 各位リンカどうしてるの?
kazu yamamoto 氏が GHC 8.6 になってから(だっけ?)リンカ周りで動作しなくて困ってるらしい(OS は Mac). 僕は適当にやってて困ったことないのでよくわからない.
ちなみに GHC 8.6.3 で無事動いたらしい:
吉報:GHC 8.6.3 は macOS で問題なく使えるようになりました!
— 山本和彦 (@kazu_yamamoto) 2018年12月10日
8.4
そういえば,8.4.4 は 8.6 系が出てから出て,ちゃんとバグフィックス出すんだと感心した的な話をした.
Semigroup-Monoid Proposal
Monoid
にサブクラスとしてSemigroup
を持たせる- その方が数学的に自然
- あなたの知らないSemigroupの世界 - あどけない話
- 前のバージョンアから
-Wnoncanonical-monoid-instances
などの警告を付け足して段階的にやっている- しかし
-Wall
に含まれてないので気づかず - なんか 8.4 で急にエラーに
- しかし
- ちなみに以降は
Monoid
をインポートしなくても(<>)
が使える
MonadFail と no return
ここは脱線.
- MonadFail Proposal - HaskellWiki
Monad
にはfail
が定義されている- が
error
などを利用している残念な実装もある
- が
MonadFail
という型クラスで切り出す-Wnoncanonical-monadfail-instances
ができた?- 8.6:
MonadFailDesugaring
言語拡張がデフォルトに- do 記法の
fail
への脱糖がMonadFail
のものになる
- do 記法の
8.6
QuantifiedConstraints
- QuantifiedConstraints 言語拡張を追加
- インスタンスの定義に量化が使える
- 例:
instance (Eq a, forall b. (Eq b) => Eq (f b)) => Eq (Rose f a)
- 例:
- igrap 氏の資料
- Q: Constraint のシノニムでも使える?
- 無理だった orz
DerivingVia
DerivingVia
言語拡張についてvia
キーワードを使ってインスタンスを明示的に選択できるようになる- kayhide 氏の資料
- QuickCheck の例
- テストの実装を Via で定義
- わかりやすいスライド
- 後半の方
- タプルの例
Plugin mechanism
(誰も調べてはない) ちょうど記事があった残念ながらリンク切れ...
GHC Source Plugin 作ってみた - Qiita
終わった後の雑談で,Scala には似たような機能(Scala Compiler Plugins?)が既にあるので,真似するといいとかなんとか.
Valid hole fits
- Type holes という機能についての拡張
- コンパイルフラグで type Holes での推論アルゴリズム(?)のコントロールができるようになった(って感じかな)
シンタックスの言語拡張
- 数値リテラルに
_
が使える:10_000_000
とか do
記法の前に$
などがいらなくなる:\x -> do ...
とか
おしまい
時間経ちすぎてめっちゃ適当になってしまった. すいません. ただ,めっちゃ楽しかった.