52700.fb2
1+(2+(3+4))
Ответ на этот вопрос даёт ассоциативность, она бывает левая и правая. Например операции (+) (-) и (*)
являются лево-ассоциативными, а операция возведения в степень (^) является право-ассоциативной.
1 + 2 + 3 == (1 + 2) + 3
1 ^ 2 ^ 3 ==
1 ^ (2 ^ 3)
Приоритет функции можно узнать в интерпретаторе с помощью команды :i:
*FunNat> :m Prelude
Prelude> :i (+)
class (Eq a, Show a) => Num a where
(+) :: a -> a -> a
...
-- Defined in GHC.Num
infixl 6 +
Prelude> :i (*)
class (Eq a, Show a) => Num a where
...
(*) :: a -> a -> a
...
-- Defined in GHC.Num
infixl 7 *
Prelude> :i (^)
(^) :: (Num a, Integral b) => a -> b -> a
-- Defined in GHC.Real
infixr 8 ^
76 | Глава 5: Функции высшего порядка
Приоритет указывается в строчках infixl 6 + и infixl 7 *. Цифра указывает на старшинство операции,
а суффикс l (от англ. left – левая) или r (от англ. right – правая) на ассоциативность.
Если мы создали свою функцию, мы можем определить для неё ассоциативность. Для этого мы пишем в
коде:
module Fixity where
import Prelude(Num(.. ))
infixl 4 ***
infixl 5 +++
infixr 5 ‘neg‘
(***) = (*)
(+++) = (+)
neg
= (-)
Мы ввели новые операции и поменяли старшинство операций сложения и умножения местами и изме-
нили ассоциативность у вычитания. Проверим в интерпретаторе:
Prelude> :l Fixity
[1 of 1] Compiling Fixity
( Fixity. hs, interpreted )
Ok, modules loaded: Fixity.
*Fixity> 1 + 2 * 3
7
*Fixity> 1 +++ 2 *** 3
9