2016-05-03 10 views
0

Für eine Funktion, die denselben Operanden verwendet, z. + oder * mehr als einmal, wie wird es bewerten?In welcher Reihenfolge würde Haskell 2 Operanden gleicher Priorität auswerten?

Zum Beispiel in dem folgenden Code:

prodOfThree :: Int -> Int -> Int 
prodOfThree a b c = a*b*c 

Wie würde die folgende bewertet werden?

prodOfThree (2+3) 4 2 

Dies ist so weit ich habe:

=> (2 + 3) * 4 * 2 
=> 5 * 4 * 2 

Und dann bin ich nicht sicher, ob es 5*4 vervielfachen würde zuerst, 4*2 erste oder 5*4*2 alle auf einmal.

+3

Vergessen Sie nicht, dass ein optimierender Compiler eine beliebige Reihenfolge der Auswertung für einen assoziativen Operator wie '*' wählen kann. Ferner kann "f 1 * f 2 * f 3" alle drei Aufrufe an "f" zuerst (in beliebiger Reihenfolge) ausführen und dann die Multiplikationen (in beliebiger Reihenfolge) ausführen oder beide irgendwie mischen: die Vorrangstellung steht in keinem Zusammenhang mit der Bewertungsreihenfolge der Argumente. (Die Datenkausalität muss natürlich respektiert werden) – chi

Antwort

3

können Sie fragen nach einem infixity mit GHCI des Betreibers:

>>> :info (*) 
class Num a where 
    ... 
    (*) :: a -> a -> a 
    ... 
     -- Defined in `GHC.Num' 
infixl 7 * 

Oder Sie können look it up on Hackage. Eine gute Möglichkeit, Hackage zu suchen, ist mit Hoogle oder Hayoo.

Weil * infixity hat infixl 7 Dies bedeutet, es ist linksassoziativen und hat Vorrang . Daher ist a * b * c(a * b) * c.

Ein interessanteres Beispiel ist ein Operator, der nicht die mathematische Eigenschaft der Assoziativität wie - hat (nicht zu verwechseln mit Infixität, die es hat). Die Infixität ist infixl 6 und daher a - b - c ist (a - b) - c.

Ein Beispiel für einen rechtsassoziativ Operator ist ::

>>> :info (:) 
data [] a = ... | a : [a]  -- Defined in `GHC.Types' 
infixr 5 : 

So a : b : c ist a : (b : c). Beachten Sie, dass, wenn es linksassoziativ war, a : b : c (wahrscheinlich) ein Typfehler sein würde!

+0

Ah brilliant. Vielen Dank. Ich habe speziell nachgeschaut, wie Haskell es bewertet, und bin nicht auf ein Beispiel gestoßen, das dies erklärt. – MichaelAS

Verwandte Themen