1

リストを受け取ってオプション リストを返す再帰関数に問題があります。たとえば、関数all_except_one:

val all_except_one : 'a -> 'a list -> 'a list option = <fun> 

の最初の出現箇所が'aリストから削除されます。'aがリストにない場合は、を返す必要がありますNone

オプションがなければ、次のようなコードがあります。

let same_string s1 s2 =
  s1 = s2

let rec all_except_one str str_l =
  match str_l with
  | [] -> []
  | hd::tl -> if same_string hd str
              then tl
              else hd::(all_except_one str tl)

しかし、オプションを追加しようとすると、再帰呼び出しを行うときに邪魔になります。

4

3 に答える 3

4

アンoption listのように見えます[ None; Some "abc"; None ]。またはlist optionのように見える が必要だと思います。Some ["a"; "b"; "c"]None

主な質問については、ケースごとに再帰呼び出しを処理する必要があります。再帰呼び出しが None を返す場合、None も返します。再帰呼び出しが a を返す場合Some list、あなたは を返しSome (longer list)ます。基本ケース (リストが空の場合) も再考する必要があると思います。

于 2013-10-17T23:37:09.643 に答える
0

再帰呼び出しの結果を照合する代わりに、アキュムレータ引数を使用してヘルパー関数を記述します。

let remove_first elt list =
  let rec loop acc = function
    | [] -> None
    | x::xs ->
        if x = elt then Some (List.rev_append acc xs)
        else loop (x::acc) xs in
  loop [] list

このようにすることの小さな利点は、ループが末尾再帰になることです。

于 2013-10-18T08:19:46.447 に答える
0

正直なところ、代わりにsame_string使用できるのに、なぜ関数が必要なのかわかりません=

次のように、必要な機能を実装することをお勧めします。

let rec all_except_one str str_l = match str_l with
  | [] -> None
  | hd :: tl -> if hd = str then Some tl else 
      match all_except_one str tl with
      | None -> None
      | Some x -> Some (hd :: x)

あなたの場合、何が問題を引き起こしましたか?

于 2013-10-17T23:50:06.780 に答える