-2

NONE文字列と文字列のリストを取り、文字列リストに文字列がない場合は返す関数を作成したい、そうでない場合SOMEは、含まれていないことを除いて文字列の元のリストと同じ文字列のリストを返します最初の文字列 (パターン):

fun my_function (pattern, source_list) =
  case source_list 
    of [] => NONE
    | [x] => if pattern = x then SOME [] else NONE
    | x::xs => 
      if pattern = x 
      then SOME (xs) 
      else SOME (x) :: my_function (pattern, xs) (* this is wrong, what to do here?*)


val a = my_function ("haha", ["12", "aaa", "bbb", "haha", "ccc", "ddd"]) (* should be SOME ["12", "aaa", "bbb", "ccc", "ddd"]*)  
val a2 = my_function ("haha2", ["123", "aaa", "bbb", "haha", "ccc"]) (*should be NONE*)
val a3 = my_function ("haha3", ["haha3"]) (* should be SOME []*)

3番目のケースで混乱しています:x::xs => ....そこで何をすべきですか? sml ライブラリ関数を使用したくないことに注意してください。

4

1 に答える 1

0

この問題は再帰に適しているとは思えませんが、組み込みList.filter関数を使用してリストを削除してみませんpatternか? フィルタリングされたリストの長さが元のリストと同じである場合、そのパターンはリストに含まれていません。

fun my_function (pattern, source_list) = let
  val flist = List.filter (fn x => pattern <> x) source_list
  in
    if (length flist) = (length source_list) then NONE
    else SOME flist
  end

の出現箇所はすべてpatternによって削除されることに注意してくださいList.filter

于 2013-10-26T10:33:15.397 に答える