Deux ou plusieurs équations définissant une fonction dans Haskell peuvent-elles partager le même bloc where / let?

StackOverflow https://stackoverflow.com/questions/827994

Question

Deux ou plusieurs équations définissant une fonction dans Haskell peuvent-elles partager le même répertoire où / let block?

Me laisser présenter un exemple artificiel pour illustrer la question.

Tout d’abord, considérez le code suivant comme point de départ:

someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

Jusqu'ici, tout va bien. Mais alors, imaginons que je dois traiter avec un & "Autre cas &" ;, où je dois renvoyer zéro si v3 == 99 et différence & Lt; 4 (complètement arbitraire, mais disons que ce sont mes exigences).

Ma première pensée serait de faire ceci:

someFunction v1 v2 99 | difference < 4 = 0
someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

Cependant, cela ne fonctionnera pas, car la première équation de someFunction et la seconde équation de someFunction ne partagent pas le même bloc where. Ce n'est pas un problème dans cet exemple artificiel, car il n'y a qu'une seule variable dans le bloc where (& «Différence &»). Mais dans le monde réel, il pourrait y avoir un grand nombre de variables et il serait inacceptable de les répéter.

Je sais déjà comment résoudre ce problème en utilisant des gardes et en n’ayant qu’une seule équation. La question qui se pose est la suivante: existe-t-il un moyen pour plusieurs équations de partager la même clause where / let? Parce qu’il semble souhaitable d’avoir plusieurs équations avec des modèles différents au lieu d’être obligées d’avoir une seule équation avec plusieurs gardes.

Était-ce utile?

La solution

Une option serait de lever la fonction dans le bloc where lui-même:

someFunction v1 v2 = f
    where
        f 99 | difference < 4 = 0
        f v3 = difference ^ v3
        difference = v1 - v2

Autres conseils

Je pense que vous ne pouvez pas. Votre meilleure solution est probablement quelque chose comme:

someFunction v1 v2 v3 | v3==99 && difference<4 = 0
                      | otherwise = difference ^ v3
                      where difference = v1 - v2
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top