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