SML列表选项撤消;如何使用递归输出一些列表

时间:2019-01-08 00:13:29

标签: string list recursion sml

当前,我的代码接收一个字符串s和一个字符串列表sl,并返回一个字符串列表,其中s被删除(一次)

fun all_except_option (s, sl) =
    case sl of
    [] => []
      | hd::tl = if same_string(s, hd)
          then tl
          else hd::all_except_option(s, tl) 

但是,如果字符串NONE不在列表中,我想返回s,如果字符串,则返回SOME (当前函数的输出) 。但是,我不能简单地在SOME(之前添加hd::all_except_option(s, tl),因为hd将附加到输出选项的内容上,我不知道该怎么做。

编辑:谢谢大家!

4 个答案:

答案 0 :(得分:1)

听起来您需要一个新功能:

fun some_option(s,sl) = SOME( all_except_option(s, sl) )

嗯,不完全是,因为它不能处理all_except_option返回[]的情况,但我将保留它作为练习。

答案 1 :(得分:1)

fun all_except_option (s, ss) =
    case ss of
      [] => NONE
    | s'::ss' =>
        if s = s' then SOME ss' else
        case all_except_option (s, ss') of
          NONE => NONE
        | SOME ss'' => SOME (s'::ss')

请注意,这只会删除s的第一个匹配项,它会反映您的版本。

您也可以使用Option.map来避免出现嵌套的情况:

fun all_except_option (s, ss) =
    case ss of
      [] => NONE
    | s'::ss' =>
        if s = s' then SOME ss'
        else Option.map (fn ss' => s'::ss') (all_except_option (s, ss'))

答案 2 :(得分:0)

您可以使用

case all_except_option(s, tl) of ...

匹配两种不同的情况并以适当的方式处理每种情况。

答案 3 :(得分:0)

安德烈亚斯·罗斯伯格(Andreas Rossberg)提供了两个完整的例子。

这是一个变体,其中模式匹配位于函数的参数中:

fun curry f x y = f (x, y)

fun all_except_option (s, []) = NONE
  | all_except_option (s, t::ts) =
      if s = t
      then SOME ts
      else Option.map (curry op:: t) (all_except_option (s, ts))

其中curry op:: t是要获取列表并将t放在其前面的函数:

- curry op:: "x" ["y", "z"];
> val it = ["x", "y", "z"] : string list

等效于fn ss' => t::ss'