Recursion 生成一个函数,该函数返回除参数外的原始列表

Recursion 生成一个函数,该函数返回除参数外的原始列表,recursion,functional-programming,sml,Recursion,Functional Programming,Sml,我想做一个函数,它接受一个字符串列表和一个字符串,如果字符串列表中没有字符串,则返回NONE,否则它返回一些字符串列表,与原始字符串列表相同,只是它不包含初始字符串模式: fun my_function (pattern, source_list) = case source_list of [] => NONE | [x] => if pattern = x then SOME [] else NONE | x::xs => if

我想做一个函数,它接受一个字符串列表和一个字符串,如果字符串列表中没有字符串,则返回NONE,否则它返回一些字符串列表,与原始字符串列表相同,只是它不包含初始字符串模式:

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 []*)
我被第三种情况弄糊涂了:x::xs=>。。。。你应该在那里做什么?
请注意,我不想使用任何sml库函数。

我觉得这个问题不太适合递归,但是为什么不使用内置的List.filter函数来消除模式列表呢?如果过滤列表的长度与原始列表的长度相同,则该模式不会出现在列表中:

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

请注意,所有出现的模式都将被List.filter删除。

如果模式出现多次,该怎么办?它们都应该被删除吗?@tahatmat,假设它只能发生一次。我不想使用任何库函数。@Alex,如果我可以问的话,为什么不呢?