1
votes

Récursivité des options de liste SML; comment utiliser la récursivité pour afficher une liste

Actuellement, mon code prend une chaîne s et une liste de chaînes sl et renvoie une liste de chaînes où s a été supprimé (une fois)

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) 

Cependant, ce que je veux, c'est retourner NONE si la chaîne s n'est pas dans la liste et si c'est le cas, retourner SOME ( sortie de la fonction courante ) . Cependant, je ne peux pas simplement ajouter CERTAINS ( avant hd :: all_except_option (s, tl) car hd sera ajouté à quelque chose qui génère une option et je ne sais pas comment le faire.

Modifier: merci à tous!


0 commentaires

4 Réponses :


1
votes

Il semble que vous ayez besoin d'une nouvelle fonction:

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

Eh bien, pas tout à fait cela, car il ne gère pas le cas où all_except_option renvoie [] , mais je vais laisser cela comme un exercice.


0 commentaires

0
votes

Vous pouvez utiliser

case all_except_option(s, tl) of ...

pour faire correspondre les deux cas différents et gérer chacun d'eux de la manière appropriée.


0 commentaires

1
votes
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 commentaires

0
votes

Andreas Rossberg a fourni deux exemples complets.

Voici une variante où la correspondance de motif est plutôt dans l'argument de la fonction:

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

curry op :: t est la fonction qui prend une liste et met t devant celle-ci:

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))

et équivaut à fn ss '=> t :: ss' .


0 commentaires