У Haskell
можна оголошувати свої оператори. Вони можуть складатись з одного або кількох символів. Дозволяються наступні символи ~!?.@#$%^&*-<=>+\|/
. Також можна використовувати символ :
, але він повинен розташовуватись у середині або кінці, не на початку.
Оголошуються оператори в синтаксисі схожому на виклик
x *+* y = x^2 + y^2
або можна використати префіксну форму
(*+*) x y = x^2 + y^2
Примітка: Функції можна оголошувати в інфіксній формі.
ЗВЕРНІТЬ УВАГУ!: Усі оператори є бінарні окрім унарного мінуса який обовʼязково обгортають в круглі дужки.
Усі оператори мають пріоритети для правильної роботи, саме за їхньої допомоги вираз 2 + 2 * 2
вичислюється правильно й результат дорівнюватиме 6
, а не 8
. Є десять рівнів пріоритету від нуля до девʼяти.
Але що робити з кількома операторами якщо у них один пріоритет, це може бути кілька викликів одного оператора. Тут потрібно використати асоціативність. Є два види асоціативності ліва і права. Ліва асоціативність це коли оператори застосовуються по черзі зліва на право, а права навпаки.
(2 + 1) - 5 -- ліва
2 + (1 - 5) -- права
Оголошується асоціативність оператора за допомоги ключових слів:
infixl
- ліваinfixr
- праваinfix
- відсутня
Якщо асоціативність відсутня, то такий оператор не можна викликати кілька раз або з іншими операторами того ж пріоритету в одному виразі.
Вказується асоціація і пріоритет у такому синтаксисі infix[rl] <prio> <operator>
. Вказується це, або до, або після оголошення самого оператора, але в інтерпретаторі це мусе бути одним рядком, тому їх потрібно розділити крапкою з комою.
infixl 7 +**
a +** b = a^2 + b^2
Якщо цього не вказати, то оператор матиме ліву асоціативність і девʼятий, найвищий, пріоритет.
Дізнатись цю інформацію про оператор можна за допомоги команди інтерпретатора info
.
ghci> infixl 7 +**; (+**) a b = a^2 + b^2
ghci> 5 +** 4
41
ghci> :i (+**)
(+**) :: Num a => a -> a -> a -- Defined at <interactive>:1:15
infixl 7 +**
Якщо явно не вказати infix
, то й у виводі цієї команди не буде такої інформації.
У Haskell
немає вбудованих операторів. Всі стандартні оператори оголошені в стандартній бібліотеці. Є такі стандартні оператори.
infixr 8 ^, ``
infixl 7 *, /, `div`, `mod`
infixl 6 +, -
infix 4 ==, /=, <, <=, >=, >
Це не всі, але інші ми розглянемо пізніше. Оператор ``
це оператор виклику функції в інфіксному форматі. Виклик функції у префіксному вигляді має праву асоціативність і девʼятий пріоритет.
/=
це оператор не рівності, в інших мовах зазвичай він виглядає !=
. Оператори порівняння не мають асоціативності, тому їх не можна обʼєднувати в ланцюжок.
#програмування #haskell #hs #оператори #створення #оголошення #асоціативність #пріоритети #стандартні #стандартна #бібліотека #інтерпретатор #ghci #infix #infixl #infixr #виклик #функції #функцій #префіксна #інфіксна #форми