#%D0%BE%D0%B3%D0%BE%D0%BB%D0%BE%D1%88%D0%B5%D0%BD%D0%BD%D1%8F

#Оголошення: цей акаунт заморожується до невизначеного часу.

Перевіряйте свіжі новини й тексти на нашому сайті netfreedom.org.ua/

Дякуємо!

Найменшенькийbalaraz@social.net.ua
2024-02-22

У 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 #виклик #функції #функцій #префіксна #інфіксна #форми

Найменшенькийbalaraz@social.net.ua
2024-02-16

Тепер перейдемо до створення власних функцій. Ми це вже робили у двох попередніх програмах. Там ми створювали функцію main яка не приймала жодних аргументів, але вони можуть приймати вхідні аргументи. Щоб створити функцію з аргументами потрібно перелічити їх до знаку =, таким чином розділяється оголошення віт тіла функції. Виглядає це так

sumSquares x y = x ^ 2 + y ^ 2

Викликати її потрібно так

sumSquares 5 3

Назви функцій та її аргументів повинні починатись з літери у нижньому регістрі, або символ підкреслення. Після неї можна ставити літери у різних регістрах, символ підкреслення та одинарну лапку('). Лапку не можна ставити у назви ідентифікаторів в інших мовах.

У Haskell можна створювати функції які спеціалізують інші функції. Для цього потрібно використати часткове застосування. Для прикладу візьмемо функцію max зі стандартної бібліотеки. Вона приймає два аргументи та повертає більший з них. Але іноді нам може знадобитись порівнювати різні числа з константою, наприклад нулем. У такому разі ми можемо створити функцію яка буде повертати нуль якщо передане її число більше нуля, і нуль якщо менше чи рівне.

lowerLimit x = max 0 x

Або використати часткове застосування.

lowerLimit = max 0

Виклик обидвох цих функцій не відрізняється.

lowerLimit 5

#програмування #haskell #функції #оператори #чсткове #застосування #створення #оголошення

Я спочатку думав що буде невеликий допис, але довелось ділити на два коли дописав.

😎 Побачив вітрину Правекс-банку (частина італійської банківської групи Intesa Sanpaolo) з вікна – на ній був рекламний постер з зображенням двох усміхнених щасливих людей + слоган:

"Що обрати, море чи гори?"

Хороше питання, звучить правда іронічно

#банки #оголошення

Client Info

Server: https://mastodon.social
Version: 2025.04
Repository: https://github.com/cyevgeniy/lmst