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)。

2 つ目では、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])

2番目のものを使用すると、次のようになります。

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