选项如何运作?

时间:2014-10-24 19:29:09

标签: ml

这是一个在列表中查找最大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

正在运作。

1 个答案:

答案 0 :(得分:1)

tl_ans将具有int option类型,因为它被定义为将max1应用于tl xs的结果。如果isSome tl_anstrue,那么这意味着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>