これは、あなたが疑問に思っているような例でしょうか?
fun f n =
let
fun g k =
if k = n then [] else k :: g (k-1)
in
g
end
名前を付けることによってのみ再帰的な定義を作成できますが、let
式はどこにでも記述できるため、それは問題ではありません。
コメントに具体的に答えるために更新します。
fun f g =
let
fun h 0 = g 0
| h i = h (i-1) + g i
in
h
end
(より効率的な実装はh
末尾再帰になります。)