正格評価

Lean は Haskell と同様に純粋関数型言語ですが,Haskell とは異なり 正格評価 です.つまり,関数を評価する前に引数をすべて評価します.これは純粋関数型ではない Python や Rust, Julia などと同様です.

次のコード例の selectFstcond として true を渡されれば,単に fst を返します.つまり trace 20 は返り値には必要ないので,もし遅延評価なら評価されません. しかし実際には評価されるので,Lean は正格評価だとわかります.

/-- 条件 `cond` が true なら最初の引数を,
false なら2番目の引数を返す関数 -/
def selectFst (cond : Bool) (fst snd : Nat) :=
  if cond then
    fst
  else
    snd

/-- 与えられた自然数をそのまま返す関数.
実行されると infoview に表示が出る. -/
def trace (n : Nat) : Nat :=
  dbg_trace "trace is called"
  n

/--
info: trace is called
10
-/
#eval selectFst true 10 (trace 20)

なお if 式を直接評価した場合は,必要のない枝は評価されません.

/-- info: 10 -/
#eval (if true then 10 else trace 20)