J'ai écrit ma propre définition récursive d'un foldLeft
et je voudrais l'utiliser avec cette fonction joinTerminateLeft
qui prend une liste de chaînes et un terminateur et crée une nouvelle chaîne avec ceux chaînes toutes séparées par le terminateur.Scala en utilisant foldLeft pour insérer le terminateur entre la liste des chaînes
Par exemple List("a", "b", "c", "d")
avec terminaison ;
finirait par être a;b;c;d;
Voici mon foldLeft
que je pense est très bien, mais mon terminateLeft
ne fonctionne pas pour une raison étrange, une idée?
def foldLeft [A,B] (xs:List[A], e:B, f:(B,A)=>B) : B = {
def auxFoldLeft(xs: List[A], e: B) : B = {
xs match {
case Nil => e
case x::xs => auxFoldLeft(xs, f(e, x))
}
}
auxFoldLeft(xs, e)
}
def joinTerminateLeft (xs : List[String], term : String) : String = {
def f(s: String, s2: String) : String = s + s2
xs match {
case Nil => ""
case x::xs => x + foldLeft(xs, term, f)
}
}
Quand je lance joinTerminateLeft
a, b, c, d, il arrête après B pour une raison quelconque et sort les chaînes c, d, mais pas avec la terminaison.
Donc c'est une pratique? Parce que 'mkString ("; ")' fonctionne parfaitement bien. – Psidom
Oui, c'est pour l'entraînement. Je dois accomplir joinTerminateLeft en utilisant mon foldLeft sans aucune méthode supplémentaire à part la concaténation de chaîne que je suppose nécessaire. – mocode9
De plus, je ne pense pas que 'foldLeft' soit la bonne fonction pour cela, car ici vous n'avez pas besoin d'une valeur initiale pour rejoindre la liste sous forme de chaîne. Une fonction avec une signature similaire de 'reduce' pourrait être mieux adaptée. – Psidom