module HelloWorld; inductive ℕ { zero : ℕ; suc : ℕ → ℕ; }; inductive V { zeroV : V; sucV : V; }; infixl 6 +; + : ℕ → ℕ → ℕ; + zero b := b; + (suc a) b := suc (a + b); infixl 7 *; * : ℕ → ℕ → ℕ; * zero b := zero; * (suc a) b := b + (a * b); axiom Action : Type; compile Action { ghc ↦ "IO ()"; }; infixl 1 >>; axiom >> : Action → Action → Action; compile >> { ghc ↦ "(>>)"; }; axiom String : Type; axiom putStr : String → Action; compile putStr { ghc ↦ "putStrLn"; }; doTimes : ℕ → Action → Action; doTimes zero _ := putStr "done"; doTimes (suc n) a := a >> doTimes n a; three : ℕ; three := suc (suc (suc zero)); main : Action; main := doTimes three (putStr "hello world"); end;