J'ai du mal à obtenir un comportement «simple»: diviser le code de correspondance de modèle en deux fonctions distinctes.Correspondance de motif: code fractionné avec fonction partielle?
Je simplifie le modèle à des fins de clarté:
abstract class Animal
case object Dog extends Animal
case object Cat extends Animal
case object Bird extends Animal
case object Bat extends Animal
case object Dolphin extends Animal
Je veux match de motif sur ceux-ci sur les différentes fonctions (parce que le code actuel est assez long), mais il y a d'autres arguments si PartialFunctions donnent moi les malades ...
Dans un monde parfait, je pourrais écrire:
type PF = PartialFunction[(Animal, Int, String), String]
private def processFlying(a: Animal, n: Int, loc: String): PF = {
a match {
case Bird => n + " birds found in " + loc
case Bat => n + " bats found in " + underground(loc)
}
}
private def processMarine(a: Animal, n: Int, loc: String): PF = {
a match {
case Dolphin => n + " dolphins found in " + submarine(loc)
}
}
private def processPet(a: Animal, n: Int, loc: String): PF = {
a match {
case Dog => n + " dogs found in " + loc
case Cat => n + " cats found in " + loc
}
}
def processAnimal(a: Animal, number: Int, location: String) = {
val processAll = processFlying orElse processMarine orElse processPet
processAll(a, n, location)
}
Cependant cela ne fonctionne pas. Principalement parce que j'ai besoin de plusieurs arguments dans mes fonctions. "Pourquoi ne pas utiliser de tuples?" Dirais-tu? Eh bien, j'ai essayé et le compilateur ne cesser de se plaindre du type attendu est différent de celui type réel et différent à mon alias :(
Toute aide, des conseils ou d'autres ides sera utile!
Vive
EDIT: Je suivi la réponse de Cyrille bu Je dois aussi effectuer des travaux avant le match, comme celui-ci:
val processFlying: PF = {
// doSomething, like declare a sub-function f
{
case (b: Bird, n, loc) => f(b)
case (b: Bat, n, loc) => f(b)
}
}
Pourquoi votre sous-fonction doit-elle être dans le 'val'? Est-ce que ça ne peut pas être, disons un 'private def' à côté? –
C'est ce que j'ai fait, mais je n'en ai pas besoin ailleurs, alors ... :) De plus, je voulais en profiter en utilisant une fermeture. C'est du zèle, il semble que les choses fonctionnent bien maintenant. Mais si quelqu'un a une solution, je reste conscient –