部分型構文

{x : T // p x} は、部分型を表す構文です。

/- info: { x // x > 0 } : Type -/ #check { x : Int // x > 0 }

もしこの構文がなければ、Subtype を定義するには以下のように書く必要があります。

/-- 標準の `Subtype` を真似て自前で定義した型 -/ structure MySubtype {α : Type} (p : α → Prop) where val : α property : p val -- 正の自然数全体を表す部分型 #check MySubtype (fun x : Nat => x > 0)

しかし、この構文があるおかげで、次のように見やすく簡潔に書くことができます。

@[inherit_doc MySubtype] syntax "my{ " ident (" : " term)? " // " term " }" : term macro_rules | `(my{ $x : $type // $p }) => ``(MySubtype (fun ($x:ident : $type) => $p)) | `(my{ $x // $p }) => ``(MySubtype (fun ($x:ident : _) => $p)) -- 正の自然数全体を表す部分型 #check my{ x // x > 0 } -- 正の整数全体の型 #check my{ x : Int // x > 0 }