CoeDep
CoeDep
は型強制を行うための型クラスですが,Coe
と異なり「項に依存する型強制」(dependent coercion)を行うことができます.
たとえば空でないリストからなる型 NonEmptyList
を定義したとします.空リストを変換する方法がないため,List α → NonEmptyList α
という変換を定義する自然な方法はありません.しかし CoeDep
を使えば空でないリストに限って NonEmptyList
に変換するという型強制を定義することができます.
structure NonEmptyList (α : Type) : Type where
head : α
tail : List α
-- リストから `NonEmptyList` に変換することができない
#check_failure ([1, 2] : NonEmptyList Nat)
variable {α : Type}
instance (x : α) (xs : List α) : CoeDep (List α) (x :: xs) (NonEmptyList α) where
coe := {
head := x
tail := xs
}
-- 変換できるようになる
#check ([1, 2] : NonEmptyList Nat)