Skip to content

Commit 861224a

Browse files
authored
Merge pull request #170 from haskell-jp/hiw2019-ghc-future
記事の追加: HIW 2019で発表された、GHC 8.10に導入されるであろう機能
2 parents fb3657d + a3a3bee commit 861224a

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
---
2+
title: HIW 2019で発表された、GHC 8.10に導入されるであろう機能
3+
subHeading: ~HIW 2019参加レポート その2~
4+
headingBackgroundImage: ../../img/background.png
5+
headingDivClass: post-heading
6+
author: Yuji Yamamoto
7+
postedBy: <a href="http://the.igreque.info/">Yuji Yamamoto(@igrep)</a>
8+
date: September 17, 2019
9+
tags: GHC, Haskell Implementors' Workshop
10+
...
11+
---
12+
13+
[前回](/posts/2019/hiw-ghc8.8.html)から引き続き、[Haskell Implementors' Workshop 2019](https://icfp19.sigplan.org/home/hiw-2019#About)への参加レポートとして、私の印象に残った発表をいくつか紹介します。
14+
今回は、「GHC 8.10に導入されるであろう機能」です。
15+
いずれも該当するMerge Requestはmasterブランチにマージ済みなので、おそらくGHC 8.10で提供されるでしょう。
16+
17+
## HoleFitPlugins and the future of interactive development in GHC
18+
19+
- 発表者: Matthías Páll Gissurarson *Chalmers University of Technology, Sweden*
20+
- 該当のMerge Request: [!153](https://gitlab.haskell.org/ghc/ghc/merge_requests/153)
21+
- 該当のGHC Proposal: なし
22+
23+
[昨年のHaskell Symposiumでも発表](https://icfp18.sigplan.org/details/haskellsymp-2018-papers/10/Suggesting-Valid-Hole-Fits-for-Typed-Holes-Experience-Report-)されてGHC 8.6で導入された、「Valid Hole Fits」という機能のさらなる拡張について。
24+
25+
まず、「Valid Hole Fits」という機能について軽く紹介します<small>(詳しくは[こちらのスライド](https://wataru86.github.io/slides/vhs/)が参考になるかと思います)</small>。
26+
「Valid Hole Fits」はアンダースコア `_`で始まる識別子を書いたとき、GHCが推論した型にマッチする関数をエラーメッセージに付記することで、ユーザーがどんな式を書けばよいか、ヒントを与えてくれるものです。
27+
28+
例えば、
29+
30+
```haskell
31+
map (length . _someFunc) [True, False, True]
32+
```
33+
34+
上記のように、アンダースコア `_`で始まる識別子を書いたとき、
35+
36+
```haskell
37+
<interactive>:1:16: error:
38+
...
39+
Valid hole fits include
40+
enumFrom :: forall a. Enum a => a -> [a]
41+
with enumFrom @Bool
42+
(imported from Prelude (and originally defined in GHC.Enum))
43+
show :: forall a. Show a => a -> String
44+
with show @Bool
45+
(imported from Prelude (and originally defined in GHC.Show))
46+
repeat :: forall a. a -> [a]
47+
with repeat @Bool
48+
(imported from Prelude (and originally defined in GHC.List))
49+
return :: forall (m :: * -> *) a. Monad m => a -> m a
50+
with return @[] @Bool
51+
(imported from Prelude (and originally defined in GHC.Base))
52+
pure :: forall (f :: * -> *) a. Applicative f => a -> f a
53+
with pure @[] @Bool
54+
(imported from Prelude (and originally defined in GHC.Base))
55+
mempty :: forall a. Monoid a => a
56+
with mempty @(Bool -> [a0])
57+
(imported from Prelude (and originally defined in GHC.Base))
58+
```
59+
60+
といった具合にアンダースコアで始まる識別子`_someFunc`の型を`Bool -> [a0]`と推論した上で[^type-hole]実際にその型に該当する関数を当該のスコープにおいてアクセスできる関数の中から探して教えてくれるそれがValid Hole Fitsという機能です
61+
62+
[^type-hole]: 復習: この、「アンダースコアで始まる識別子`_someFunc`の型を`Bool -> [a0]`と推論した上でエラーメッセージにおいて`Found hole: _someFunc :: Bool -> [a0]`と教えてくれるのがType Holeという機能なのでした
63+
64+
今回発表されたHoleFitPluginsという機能は名前のとおりこのValid Hole Fitsに対するプラグイン機構です
65+
Valid Hole Fitsが表示する型にマッチした関数を探す処理をHaskellのコードで書き換えられるようにしてくれます
66+
67+
そこまでする必要あるの?」という気もしてきますが発表者曰く
68+
69+
- HoogleをはじめTensorFlowなどGHCの外部にあるものを利用して型にマッチした関数を探せるようにするために必要
70+
- GHCiとこの機構を組み合わせることでもっとインタラクティブな開発を促進したい
71+
72+
という意図があるそうです
73+
74+
最新安定版のGHCでは利用できませんが[ドキュメントがこちら](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/extending_ghc.html#hole-fit-plugins)にあるのでGHCHEAD<small>(masterブランチで開発中のバージョン)</small>をコンパイルすれば使用できるようです
75+
76+
加えて発表では`_`で始まる識別子を書く際の構文を拡張することでどのようにcandidateを探すか指定できるようにするなんて機能も紹介されました<small>(ドキュメントを読む限りこの機能はまだHEADに入ってない?)</small>。
77+
例えばHoogleを使ってValid Hole Fitsを探したいとき次のように書くことで検索対象を`Control.Applicative`に限定するといったことをできるようしてくれます
78+
79+
```haskell
80+
g :: [a] -> [[a]]
81+
g = _{hoogleLookup "+Control.Applicative"}
82+
```
83+
84+
Valid Hole Fitsの検索方法をその場で微調整したい、というときに使うものですね。
85+
86+
## Visible dependent quantification
87+
88+
- 発表者: Ryan Scott *Indiana University at Bloomington, USA*
89+
- 該当のMerge Request: [!378](https://gitlab.haskell.org/ghc/ghc/merge_requests/378)
90+
- 該当のGHC Proposal: [0081-forall-arrow](https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0081-forall-arrow.rst)
91+
92+
タイトルのとおり、「Visible dependent quantification」という機能の紹介です。
93+
94+
最近のバージョンのGHCiにおける`:kind`コマンドは、次のような、GHCがサポートしていない構文の型注釈を出力することがあります。
95+
例えば
96+
97+
```haskell
98+
> :set -XKindSignatures
99+
> :set -XPolyKinds
100+
> data SomeType k (a :: k)
101+
> :kind SomeType
102+
SomeType :: forall k -> k -> *
103+
```
104+
105+
における、`SomeType :: forall k -> k -> *``forall k ->`という部分です。
106+
現在のHaskellで`forall k`などと書くときは、必ず
107+
108+
```haskell
109+
SomeType :: forall k. k -> *
110+
```
111+
112+
といった具合に、ピリオドで区切った構文になります。
113+
ところが先ほどの`:kind`の出力では、`forall k ->`とあるとおり、`forall k`に<small>(型ではなく、カインドとしての)</small>関数を表す`->`が使われています。
114+
「Visible dependent quantification」はまさにこれを、`:kind`コマンドによって出力される構文だけではなく、ユーザーが直接書ける構文にしよう、というものです。
115+
GHCに「依存型」という機能を加える「Dependent Haskell」にも必要な機能だそうです。
116+
私自身はこの機能を使う機会がちょっと思い浮かばなかったので省略しますが、より詳しい解説は発表者である[Ryan自身による記事(英語)](https://ryanglscott.github.io/2019/03/15/visible-dependent-quantification-in-haskell/)をご覧ください。何が「Visible」でどう「Dependent」なのかわかるはずです。

0 commit comments

Comments
 (0)