本記事は 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

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

UnboxedSums

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 で無事動いたらしい:

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 のものになる

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

シンタックスの言語拡張

  • 数値リテラルに _ が使える: 10_000_000 とか
  • do 記法の前に $ などがいらなくなる: \x -> do ... とか

おしまい

時間経ちすぎてめっちゃ適当になってしまった. すいません. ただ,めっちゃ楽しかった.