Отказ от выбора списка SML; как использовать рекурсию для вывода списка SOME - PullRequest
0 голосов
/ 08 января 2019

В настоящее время мой код принимает строку 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 голосов
/ 08 января 2019

Андреас Россберг представил два полных примера.

Вот вариант, в котором вместо аргумента функции используется сопоставление с образцом:

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'.

0 голосов
/ 08 января 2019

Вы можете использовать

case all_except_option(s, tl) of ...

, чтобы соответствовать двум различным случаям и обрабатывать каждый соответствующим образом.

0 голосов
/ 08 января 2019
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'))
0 голосов
/ 08 января 2019

Похоже, вам нужна новая функция:

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

Ну, не совсем так, поскольку он не обрабатывает случай, когда all_except_option возвращает [], но я оставлю это как упражнение.

...