Friday, 29 April 2016

Haskell: Operator precedence, associativity rules

The value of an expression depends on the order of evaluation of operators, which is determined by the precedence, and associativity of operators. By using associativity, we can specify whether an operator is evaluated from left to right or right to left.

*Main> 1 + 4 * 5
21

Since ‘*’ has higher precedence than ‘+ operator, then 1 + 4 * 5 = 1 + 20 = 21. If you want to evaluate ‘1+4’ first, use parenthesis.

*Main> (1 + 4) * 5
25

Following table summarizes the operator precedence and associativity rules. Haskell maintains 10 precedence levels from 0 to 9 (inclusive). Level 9 represents high precedence and level 0 represents low precedence.

There are three kinds of associativity.
a.   Non-associative (Represented by identifier infix)
b.   Left associative (Represented by identifier infixl)
c.    Right associative (Represented by identifier infixr)

Precedence Level
Left associative operators
Non-associative
Operators
Right associative operators
0


$, $!, ‘seq‘
1
>>, >>=


2


||
3


&&
4

==, /=, <, <=, >, >=,       
‘elem‘, ‘notElem

5


:, ++
6
+, -


7
, /, ‘div‘,   
‘mod‘, ‘rem‘, ‘quot‘        


8


^ , ^^ , ⋆⋆
9
!!

.


By using ‘:info’ command, you can get the precedence levels of operators.
*Main> :info +
class Num a where
  (+) :: a -> a -> a
  ...
   -- Defined in ‘GHC.Num’
infixl 6 +
*Main> 
*Main> :info ++
(++) :: [a] -> [a] -> [a]  -- Defined in ‘GHC.Base’
infixr 5 ++
*Main> 
*Main> :info ==
class Eq a where
  (==) :: a -> a -> Bool
  ...
   -- Defined in ‘GHC.Classes’
infix 4 ==



Previous                                                 Next                                                 Home

No comments:

Post a Comment