2013-06-07 14 views
18

Haskell kompilator zgłasza błąd o następującej funkcji:Haskell Wzór Matching nie działa na ujemny numer

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

przerzucanie znak rozwiązuje problem:

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

Dlaczego wzorzec dopasowania fail na negatywy i co to jest czyste obejście?

Odpowiedz

30

Nie działa, ponieważ uważa, że ​​próbujesz ponownie zdefiniować operatora minus, ponieważ f -1 = ... zostanie przetworzony jako f - 1 = ....

Aby rozwiązać ten problem po prostu trzeba dodać nawiasy:

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

To samo dzieje się w wyrażeniach. Aby wywołać balancedMax z literałem ujemnym, również potrzebujesz nawiasów.

6

ponieważ f -1 = ... pobiera analizowany jako f - 1 = ....

które, jeśli nie wiesz, co oznacza to samo, co:

(-) f 1 = .... 

która jest podobna do definiowania funkcji takich jak to:

somefunc x 1 = x + 1 

Co się dzieje jako odpowiednik definiowanie somefunc() tak:

x `somefunc` 1 = x + 1 

Tyle, że z (-) nie trzeba pisać odwrócone, pojedyncze apostrofy podczas używania go w wrostkiem pozycję, to znaczy umieszczoną między dwoma argumentami.

Dwie początkowe książki o haskellach, które obejrzałem, ostrzegają wcześnie, że unarny - musi być używany z nawiasami, np. (-3).