18

Der Haskell Compiler einen Fehler auf der folgenden Funktion führt:Haskell Pattern Matching-Fehler auf Negative Anzahl

balancedMax :: Int -> Int -> Int 
balancedMax -1 _ = -1 
balancedMax _ -1 = -1 
balancedMax a b = max a b 

das Zeichen Flipping löst das Problem:

balancedMax :: Int -> Int -> Int 
balancedMax 1 _ = -1 
balancedMax _ 1 = -1 
balancedMax a b = max a b 

Warum Muster auf den Negativen scheitern wird Matching und was ist ein sauberes Workaround?

Antwort

30

Es schlägt fehl, weil es denkt, dass Sie versuchen, den Minus-Operator neu zu definieren, da als f - 1 = ... geparst wird.

Um dies zu beheben Sie müssen nur Klammern hinzu:

balancedMax :: Int -> Int -> Int 
balancedMax (-1) _ = -1 
balancedMax _ (-1) = -1 
balancedMax a b = max a b 

Das gleiche geschieht in Ausdrücken. Um balancedMax mit einem negativen Literal aufzurufen, benötigen Sie ebenfalls Klammern.

6

weil f -1 = ... analysiert wird als f - 1 = ....

Was, wenn Sie nicht wissen, bedeutet das Gleiche wie:

(-) f 1 = .... 

, die zur Definition einer Funktion wie dies ähnlich ist:

somefunc x 1 = x + 1 

Welche entspricht gleichwertig Definieren someFunc() wie folgt aus:

x `somefunc` 1 = x + 1 

Es ist nur, dass mit (-) Sie müssen die Backticks nicht schreiben, wenn es in Infix Position unter Verwendung, das heißt zwischen den beiden Argumenten positioniert.

Die zwei beginnenden Haskell-Bücher, die ich mir angesehen habe, warnen beide frühzeitig, dass die unäre - muss mit Klammern, z. (-3).