33 lines
744 B
Text
33 lines
744 B
Text
abbrev natrec_inner {C} (n: Nat)
|
|
(z: Option C) (s: C -> Option C)
|
|
: Option C
|
|
:= match n with
|
|
| 0 => z
|
|
| n + 1 => (natrec_inner n z s).bind s
|
|
|
|
def natrec_int {C} (n: Option Nat) -- ERROR
|
|
(z: Option C) (s: C -> Option C)
|
|
: Option C
|
|
:= n.bind (λn => natrec_inner n z s)
|
|
|
|
|
|
@[inline_if_reduce]
|
|
def foo (xs : List Nat) :=
|
|
match xs with
|
|
| [] => 0
|
|
| _::xs => foo xs + 1
|
|
|
|
def error : Nat := -- ERROR
|
|
foo [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
|
|
|
|
set_option compiler.maxRecInlineIfReduce 32
|
|
def ok : Nat :=
|
|
foo [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
|
|
|
|
@[inline]
|
|
def foldr (f : Nat → β → β) (acc : β) : Nat → β
|
|
| 0 => acc
|
|
| n+1 => foldr f (f n acc) n
|
|
|
|
def toList (r : Nat) : List Nat :=
|
|
foldr (· :: ·) [] r
|