SMLで階乗

30分プログラム、その640。SMLで階乗を書いてみた。
StandardMLは学部の授業で習ったけれども、一切記憶に残っていない。
さすがにそれはまずい気がするので、当時の教科書(プログラミング言語StandardML入門)をひっぱりだして、階乗のコードを何個か書いてみた。
書いてるうちに昔の記憶がよみがえってきたー、ってこともなかったです。

ソースコード

ふつうの。

fun fact_1 n = if n = 0 then 1
	       else n * fact_1 (n-1)

パターンマッチ。

fun fact_2 0 = 1
  | fact_2 n = n * fact_2 (n-1)

ローカルな変数束縛。

fun fact_3 n =
    let
	fun fact' accum n = if n = 0 then accum
			    else fact' (n*accum) (n-1)
    in
	fact' 1 n
    end

高階関数と中置演算子

fun $ (f,g) = f g;
infixr 9 $

fun range a b = List.tabulate (b-a,fn i=>i+a);
fun fact_4 n  =
    foldl op * 1 $ range 1 n;