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!
4 Réponses :
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.
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.
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'))
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
Où 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' .