这是一个在列表中查找最大int的简单函数,但我对这些选项的工作方式感到困惑:
(* fn : int list -> int option *)
fun max1 (xs : int list) =
if null xs then NONE
else
let val tl_ans = max1 (tl xs)
in
if isSome tl_ans andalso valOf tl_ans > hd xs
then tl_ans
else SOME (hd xs)
end
它正在使用ML"选项",但我不知道如何。第一个 NONE 使用似乎很简单,但后来使用 isSome 和 valOf 似乎无处不在。我有点理解 SOME 在其类型中放置(hd xs),但我无法理解这是怎么回事
if isSome tl_ans andalso valOf tl_ans > hd xs
正在运作。
答案 0 :(得分:1)
tl_ans
将具有int option
类型,因为它被定义为将max1
应用于tl xs
的结果。如果isSome tl_ans
为true
,那么这意味着tl_ans
= SOME (valOf tl_ans)
,因此我们可以SOME
包含来自tl_ans
的值valOf
1}}(但同样,只有当我们已经知道' sa SOME
时,这就是我们需要isSome
调用的原因。
更简洁的方法是使用模式匹配,包括列表和option
值:
fun max1 (xs : int list) =
case xs
of [] => NONE
| x::rest => case max1 rest
of NONE => SOME x
| SOME max => if maxRest > x then SOME maxRest else SOME x
以这种方式编写它的巧妙之处在于,在没有首先通过检查valOf
确保可以使用isSome
来确保使用{{1}}时出现错误的空间。 / p>