Dhall v3.0.0がリリースされた.メイジャーヴァージョンの更新ということで,いくつかの破壊的変更を含む.
Some/Noneコンストラクタが予約語として導入#
Optional型のコンストラクタであるSome/Noneが予約語として追加された.
DhallにおけるOptional型のリテラルは,List型と同じく角括弧なので,リテラルで書く場合にはList型と区別するために型注釈が必須となっている.
⊢ :t [42]
List Natural
⊢ :t [42] : Optional Natural
Optional Natural
毎回型注釈を書くのは面倒なので,これまではPreludeで適宜されているOptional/SomeとOptional/Noneをインポートして使うのが常套手段だった.
⊢ :let Some = https://raw.githubusercontent.com/dhall-lang/Prelude/302881a17491f3c72238975a6c3e7aab603b9a96/Optional/Some
Some : ∀(a : Type) → ∀(v : a) → Optional a
⊢ Some Natural 42
[ 42 ] : Optional Natural
しかし,Dhall v3.0.0からはSomeとNoneの両コンストラクタが予約語として導入されることとなった.加えてSomeは型推論をしてくれるので,Type型の値を第1引数として渡さなくて済む.
⊢ Some 42
[ 42 ] : Optional Natural
種多相のサポート#
種多相(kind-polymorphism)がサポートされた.型の型であるところの種(Kind)の型を表すキーワードとしてSortが導入された.Type : Kind : Sortという関係である.
モチベーションとしては,レコードの中にType以外の種を持つ型を入れられるようにしたかったようである.
上記のpull requestの変更によって,以下のような記述が許されることが期待される.
⊢ { foo: Optional }
これまではInvalid field typeとして弾かれていたが,diffを見ると,値としてType型でない場合(例えばType → Type型など)でもレコードの値として格納できるようになったことがわかる.
diff --git a/standard/semantics.md b/standard/semantics.md
index 1183e68..5c3ec0f 100644
--- a/standard/semantics.md
+++ b/standard/semantics.md
@@ -3501,13 +3501,13 @@ A record can either store term-level values and functions:
... or store types (if it is non-empty):
- Γ ⊢ T :⇥ Kind T ≡ Type
- ────────────────────────
+ Γ ⊢ T :⇥ Kind
+ ────────────────────
Γ ⊢ { x : T } : Kind
- Γ ⊢ T :⇥ Kind T ≡ Type Γ ⊢ { xs… } :⇥ Kind
- ────────────────────────────────────────────── ; x ∉ { xs… }
+ Γ ⊢ T :⇥ Kind Γ ⊢ { xs… } :⇥ Kind
+ ─────────────────────────────────── ; x ∉ { xs… }
Γ ⊢ { x : T, xs… } : Kind
その他#
他にも,∧演算子を使ってレコードを結合した際に,レコードのキーの順序が並び替えられることを保証するためのβ簡約規則が導入されたり,PreludeにInteger/toDoubleとNatural/toDoubleが追加されたりしている.詳細なchangelogはGitHub上で確認できる.
