我目前正在学习SML,但是我很难理解下面的代码
fun good_max (xs : int list) =
if null xs
then 0
else if null (tl xs)
then hd xs
else
(* for style, could also use a let-binding for (hd xs) *)
let val tl_ans = good_max(tl xs)
in
if hd xs > tl_ans
then hd xs
else tl_ans
end
hd xs
是 int
类型,而 tl_ans
我认为是 list
类型。
为什么这段代码能够工作?系统是如何评估递归的?
如果您能使用xs = [3, 4, 5]
来展示这个过程,那将会很好。
let val y = (let val y' = old_max(tl(tl[3,4,5)))
in max(hd(tl[3,4,5],y')) end) in max(hd[3,4,5],y)let val y = (let val y' = old_max([5]) in max(4,y') end) in max(3,y) end let val y = 5 in max (3,y) 5`
- fardownmax
函数已经作为Int.max
存在于标准库中。此外,第三个case的右侧显然可以简化为max(x, goodMax xs)
-- 我之所以没有这样做是为了展示let
内部的规约方式。最后,我建议在空案例中抛出异常,因为0作为结果并不完全正确。总的来说,你可以将该函数简单地表达为一个fold,如下所示:fun goodMax [] = raise Empty | goodMax(x::xs) = List.foldl Int.max x xs
。 - Andreas Rossberg