0
votes

Convertir SEQ [Essayez [Option (chaîne, n'importe quel)]] en essayez [option [mappe [chaîne, n'importe quel]]]]]]]]]]]]]]

Comment convertir facilement SEQ [Essayez [Option [String, n'importe quel]]]]]

Si vous essayez avant de convertir une exception, l'essai converti devrait également lancer.


6 commentaires

Je ne pense pas que option [chaîne, tout] a du sens. Option prend un paramètre de type unique. Voulez-vous dire l'option [(chaîne, n'importe quel)] ?


Je ne reçois pas le point de essayer [option [quelque chose]] . L'option est soit Aucun ou Certains Signification des valeurs non valides ont été prises en charge au moment où elles atteignent Essayez . Cela semble un peu redondant.


@Jrook Il y a un scénario que vous souhaitez garder une trace si une opération est réussie ou échoue, et même cette opération réussit, elle peut renvoyer un non plus.


@TexasBruce Si je contrôle la signature et obtenez Aucun d'une opération, je sais déjà quelque chose de mauvais. Si je voulais connaître la raison pour laquelle cela s'est passé, je voudrais directement essayer l'opération. Le cas dans lequel une opération ne donne aucune erreur sans aucune erreur ne me semble douteuse. Pourquoi voudrais-je vouloir une logique pouvant produire Aucun comme valeur normale? J'apprécierais si vous pouviez me montrer un cas d'utilisation du monde réel.


@jrook Il existe de nombreux cas, tels que lorsque vous interrogez un enregistrement de DB. Vous utilisez Essayez d'indiquer s'il y a quelque chose qui ne va pas avec dB ou connexion. Ensuite, utilisez-les ou aucun pour indiquer si l'enregistrement existe.


@Texasbruce Je ne serrerais toujours pas les uns à l'autre et utilise plutôt tooption . Mais j'ai l'idée. Merci.


5 Réponses :


0
votes

Voici quelque chose qui n'est pas très propre mais peut vous aider à démarrer. Il suppose option [(chaîne, n'importe quel)] , renvoie la première échec s'il y en a dans l'entrée SEQ et juste gouttes Aucun éléments.

foo.scala xxx

exemple de session xxx < / p>


0 commentaires

-1
votes

Les solutions suivantes sont basées sur Cette réponse au point que presque em> fait la question un duplicata.

Méthode 1: Utilisation de la récursion p>

  def trySeqToMap2[X,Y](trySeq : LazyList[Try[Option[(X, Y)]]], m : Map[X,Y]= Map.empty[X,Y]) : Try[Option[Map[X,Y]]] =
    trySeq match {
      case Success(Some(h)) #:: tail => trySeqToMap2(tail, m + (h._1 -> h._2))
      case Success(None) #:: tail => tail => trySeqToMap2(tail, m)
      case Failure(f) #:: _ => Failure(f)
      case _ => Success(Some(m))
    }


0 commentaires

0
votes

Si vous êtes prêt à utiliser une bibliothèque de support fonctionnelle comme chats puis il y a deux astuces qui peuvent Aidez-y le long:

  1. Beaucoup de choses comme Liste et Essayez sont Traversable , ce qui signifie que (si les implicites de CATS sont dans la portée), ils ont une méthode de séquence pouvant échanger deux types, par exemple convertir la liste [essayer [ T]]] à essayer [liste [t]] (omet de défaut si l'un des éléments de la liste est une défaillance).

  2. Presque tous les types de conteneurs prennent en charge une méthode de la carte qui peut fonctionner sur le contenu d'un conteneur, de sorte que si vous avez une fonction de A à B puis mappe peut convertir un essayer [A] à un essayer [B] . (Dans la langue des chats, ils sont Foncteurs mais les types de conteneurs dans la bibliothèque standard en général avoir mapper déjà.)

    CATS ne prend pas directement en charge SEQ < / a>, cette réponse est donc principalement en termes de liste à la place.

    étant donné que la signature de type, vous pouvez itérativement la séquence l'élément que vous devez En effet, appuyez sur la liste Type d'un niveau dans la chaîne de type, puis Carte sur ce conteneur pour fonctionner sur son contenu. Qui peut ressembler à: xxx

    https: // scastie.scala-lang.org/xbq8zbkorscxgdjx0pgjaq a un exemple légèrement plus complet.


0 commentaires

2
votes

supposant que le type d'entrée ait un tuple à l'intérieur de l'option code> code>, cela devrait vous donner le résultat souhaité:

val in: Seq[Try[Option[(String, Any)]]] = ???

val out: Try[Option[Map[String,Any]]] = Try(Some(in.flatMap(_.get).toMap))


0 commentaires

0
votes

Un moyen d'approcher ceci consiste à utiliser un repliolft : xxx

vous démarrez avec FR vide carte. Vous utilisez ensuite A pour la compréhension pour parcourir la carte et l'élément actuels et enfin, vous ajoutez un nouveau tuple dans la carte si vous êtes présent.


0 commentaires