Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 22 additions & 8 deletions LeanByExample/Declarative/Deriving.lean
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

以下に示すように、`deriving instance C for T` とすると型 `T` に対して型クラス `C` のインスタンスを生成します。
-/
namespace Deriving --#

inductive Color : Type where
| red
Expand All @@ -19,7 +18,8 @@ set_option eval.derive.repr false
error: could not synthesize a 'Repr' or 'ToString' instance for type
Color
-/
#guard_msgs in #eval Color.red
#guard_msgs in
#eval Color.red

-- インスタンス生成
deriving instance Repr for Color
Expand Down Expand Up @@ -51,10 +51,24 @@ deriving Inhabited, Repr
class Callable (α : Type) where
call : α → String

/--
error: default handlers have not been implemented yet,
class: 'Deriving.Callable' types: [Deriving.People]
-/
#guard_msgs in deriving instance Callable for People
/-- error: default handlers have not been implemented yet,
class: 'Callable' types: [People] -/
#guard_msgs in
deriving instance Callable for People

/- 例外として、定義を展開して既存のインスタンスが見つかる場合は `deriving` が通ります。-/

/-- 適当に定義した自前の型クラス -/
class Foo (α : Type) where
foo : Unit

/-- String の Foo インスタンスを定義する -/
instance : Foo String where
foo := ()

-- `Foo` の deriving handler は作っていないが、String と bar は同じなので
-- String のインスタンスが使用される
def bar := String deriving Foo

end Deriving --#
-- String のインスタンスが使われている
#guard Foo.foo bar = ()
Loading