97 lines
1.8 KiB
Text
97 lines
1.8 KiB
Text
#check "hello"
|
||
|
||
#check 1
|
||
|
||
#check fun (x : Nat) => x + 1
|
||
|
||
#eval (fun (x : Nat) => x + 1) 3
|
||
|
||
-- Recursive functions
|
||
|
||
def fact : Nat → Nat
|
||
| 0 => 1
|
||
| n+1 => (n+1) * fact n
|
||
|
||
#eval fact 4
|
||
#eval fact 20
|
||
|
||
-- Dot notation
|
||
|
||
#eval List.map (fun x => toString x) [1, 2, 3]
|
||
|
||
#check @toString
|
||
|
||
#eval [1, 2, 3].map fun x => toString x
|
||
|
||
def List.len1 {α} (xs : List α) : Nat :=
|
||
xs.length + 1
|
||
|
||
#eval [1, 2, 3].len1
|
||
|
||
-- Inductive datatypes
|
||
|
||
inductive Tree (α : Type)
|
||
| leaf : α → Tree
|
||
| node : Tree → Tree → Tree
|
||
|
||
namespace Tree
|
||
|
||
private def toStr {α} [ToString α] : Tree α → String
|
||
| leaf a => toString a
|
||
| node left right => "(node " ++ toStr left ++ " " ++ toStr right ++ ")"
|
||
|
||
instance {α} [ToString α] : ToString (Tree α) := ⟨toStr⟩
|
||
|
||
end Tree
|
||
|
||
#eval toString (Tree.node (Tree.leaf 10) (Tree.leaf 20))
|
||
|
||
open Tree
|
||
|
||
#eval toString (node (leaf 10) (node (leaf 20) (leaf 30)))
|
||
|
||
-- Arrays
|
||
|
||
#eval #[1, 2, 3].map fun x => x+1
|
||
#eval #[1, 2, 3].set! 1 10
|
||
#eval #[1, 2, 3].push 4
|
||
|
||
-- Structures
|
||
|
||
structure Person :=
|
||
(name : String)
|
||
(age : Nat := 0)
|
||
|
||
instance : ToString Person :=
|
||
⟨fun p => p.name ++ ":" ++ toString p.age⟩
|
||
|
||
#eval toString { name := "John", age := 30 : Person }
|
||
|
||
#eval toString { name := "Jack" : Person }
|
||
|
||
def incAge (p : Person) (n : Nat) : Person :=
|
||
{ p with age := p.age + n }
|
||
|
||
#eval toString $ incAge { name := "John", age := 30 } 2
|
||
|
||
-- IO
|
||
|
||
def tst (msg : String) : IO Unit := do
|
||
IO.println "hello world";
|
||
IO.println msg
|
||
|
||
#eval tst "foo"
|
||
|
||
-- Debugging helper functions
|
||
|
||
def Tree.map {α β} (f : α → β) : Tree α → Tree β
|
||
| leaf a => leaf (f a)
|
||
| node left right => node (Tree.map left) (Tree.map right)
|
||
|
||
#print dbgTrace
|
||
|
||
#eval
|
||
let n := node (leaf 10) (node (leaf 20) (leaf 30));
|
||
let n := n.map fun x => x + 1;
|
||
-- let n := n.map fun x => dbgTrace ("x: " ++ toString x) $ fun _ => x + 1;
|
||
toString n
|