Je crée actuellement une séquence de la même manière que:
match results |> List.rev with | [] -> "No results equals no migrators" | head :: _ -> match head with | Success (dt, t) -> "All migrators succeeded" | Error (dt, ex) -> "Migration halted owing to error"
3 Réponses :
Je suppose que vous devinez plusieurs approches ici, mais une solution serait d'utiliser le déroulement: notez le list.ofseq code> à la fin, c'est juste là pour réaliser la séquence. Un moyen différent d'aller consisterait à utiliser des comprises de séquence, certains pourraient dire qu'il se traduit par un code plus clair. P> p>
Cela fonctionne réellement génial! Je savais que cela allait être l'une des fonctions avec un accumulateur mais ne réaliserait pas se dérouler pourrait être utilisée de cette façon.
Je pense que la réponse de @scrwtp est probablement la meilleure façon de le faire si votre entrée est raisonnablement petite (et vous pouvez la transformer en une liste F # pour utiliser la correspondance de modèle). J'ajouterai une version de plus, qui fonctionne lorsque votre entrée est juste une séquence et que vous ne souhaitez pas la transformer en liste.
Essentiellement, vous voulez faire quelque chose qui est presque comme Pour utiliser un exemple plus simple, les numéros suivants renvoient tous les numéros d'une séquence jusqu'à la divisible par 5: p> Donc, vous avez essentiellement besoin d'avoir un seul élément à venir - pour le faire, vous pouvez utiliser la seule chose laide ici est que vous devez ensuite aplatir la séquence à nouveau à l'aide de Ce n'est pas très gentil, une bonne chose à faire serait de définir votre propre fonction d'ordre supérieur, comme SEQ.TAKEWIIHIHILE Code>, mais cela vous donne un élément supplémentaire à la fin (celui qui, pour lequel le prédicat échoue). p>
SEQ.PAIREWise code> qui vous donne le courant et l'élément suivant de la séquence " p>
MAPI code> et
concat code>. p>
seq.takeuntiliser code> que encapsule le comportement dont vous avez besoin (et cache toutes les vilaines choses). Ensuite, votre code pourrait simplement utiliser le FUNC Et regardez bien et lisible (et vous pouvez expérimenter avec d'autres moyens de la mettre en œuvre). p> p>
Les choses laides tomaå ¡font allusion à 1) état mutable, et 2) manipulation de l'énumérateur sous-jacent. Une fonction de commande supérieure qui revenait jusqu'à ce que le prédicat tient alors de ressembler à ceci:
(migrators : seq<MigratorResult>) |> Seq.takeUntil (function Success _ -> false | Error _ -> true)