1

我对函数 ( parse_list)不太了解

None -> List.rev isNone -> []

let try_parse parse x = try Some (parse x) with Error _ -> None;;

let parse_list parse =
  let rec aux is = function
    | [] -> List.rev is, []
    | (hd :: tl) as xs ->
    match try_parse parse hd with
      | Some i -> aux (i::is) tl
      | None -> List.rev is, xs
  in aux [];;

let parse_list parse =
  let rec aux is = function
    | [] -> List.rev is, []
    | (hd :: tl) as xs ->
    match try_parse parse hd with
      | Some i -> aux (i::is) tl
      | None -> [], xs
  in aux [];;

它们不同吗?如果它们不同,你能给我一个例子吗?非常感谢你

4

1 回答 1

6

是的,它们是不同的。

在第一个中,当解析函数失败时,该函数parse_list将返回“已解析”表达式的部分列表 ( List.rev is)。

在第二个中,当 parse 函数失败时,您将从parse_list ( []) 中获得一个空列表。

使用解析函数查看此示例,该函数仅保留小于 的整数3

let test_parse x = if x < 3 then x else raise Error "error";;

通过第一个实现,您将获得:

# parse_list test_parse [1; 2; 3; 4; 5];;
  - : int list * int list = ([1; 2], [3; 4; 5])

使用第二个,您将获得:

# parse_list test_parse [1; 2; 3; 4; 5];;
  - : int list * int list = ([], [3; 4; 5])
于 2012-04-25T08:10:49.063 回答