#оператори — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #оператори, aggregated by home.social.
-
CW: Створення операторів і стандартні оператори :haskell:.
У
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 #виклик #функції #функцій #префіксна #інфіксна #форми
-
CW: Створення операторів і стандартні оператори :haskell:.
У
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 #виклик #функції #функцій #префіксна #інфіксна #форми
-
CW: Типи в :haskell:
Haskell є строго статично типізованою мовою програмування, але з можливістю автоматичного виведення типів. В усіх наших попередніх програмах ми ніде не вказували типи, компілятор чи інтерпретатор їх вивів автоматично, полегшивши нам написання коду. Але не завжди це у нього буде вдаватись, і взагалі знати типи даних обовʼязково потрібно.
Статично типізований означає що перевірка типів відбувається на етапі компіляції, а не виконання. Строга типізація означає що не явного приведення типів не відбувається, можливо тільки явно вказувати приведення.
Щоб дізнатись тип функції чи оператора в інтерпретаторі
ghciпотрібно використати команду інтерпретатораtype. Всі команди інтерпретатора починаються з символу двокрапки. Виглядає це так:type x.let x = 10 :type xКоманди інтерпретатора можна скорочувати до першої літери, але тільки якщо не відбувається колізії. Тому
:typeі:tодне і теж.Ця команда поверне нам
x :: Num p => pУ цьому рядку оператор
::схожий на=, але працює з типами, а не значеннями. За допомогою нього ми зможемо самі вказувати типи. Зліва від нього знаходиться вираз, а з права його тип. Що означає права частина у цьому випадку ми розберемо згодом, а зараз подивимось на те як уточнювати тип самостійно.let x = 10 :: IntТут ми явно вказуємо тип за допомоги оператора типізації. Тепер команда типу
:t xповерне нам такеx :: Int.Є шість основних, фундаментальних типів.
- Bool - Логічний (True, False)
- Char - Символьний ('\0' - '\1114111')
- Int - Знаковий цілочисельний (-9223372036854775808 - 9223372036854775807)
- Integer - Знаковий цілочисельний без обмежень)
- Float - Знаковий дробовий
- Double - Знаковий дробовий з подвійною точністю
Перейдімо від констант до функцій. Для прикладу візьмемо стандартну функцію
not. Вона приймаєboolі повертає інвертоване значення типуbool.not True -- Поверне False not False -- Поверне TrueТепер розберемо його тип
:t not not :: Bool -> BoolУ цьому випадку функція приймає один аргумент і саме його тип вказаний перед стрілкою, а після неї тип повернення. Але якщо буде кілька вхідних аргументів, то вони всі будуть переліченні через стрілки.
Для прикладу візьмемо оператор
&&. Щоб подивитись тип оператора потрібно взяти його у душки:t (&&).(&&) :: Bool -> Bool -> BoolПерші два
Boolце вхідні аргументи, а останній тип повернення. Саме через такі типи працює часткове застосування функцій. Візьмем(&& True)і побачимо що тип його(&& True) :: Bool -> Bool. Розташування аргументу значення не має.#програмування #haskell #типи #типізація #статична #строга #фукції #оператори #інтерпретатор #ghci #команди #type #types #typing #static #константи
-
CW: Типи в :haskell:
Haskell є строго статично типізованою мовою програмування, але з можливістю автоматичного виведення типів. В усіх наших попередніх програмах ми ніде не вказували типи, компілятор чи інтерпретатор їх вивів автоматично, полегшивши нам написання коду. Але не завжди це у нього буде вдаватись, і взагалі знати типи даних обовʼязково потрібно.
Статично типізований означає що перевірка типів відбувається на етапі компіляції, а не виконання. Строга типізація означає що не явного приведення типів не відбувається, можливо тільки явно вказувати приведення.
Щоб дізнатись тип функції чи оператора в інтерпретаторі
ghciпотрібно використати команду інтерпретатораtype. Всі команди інтерпретатора починаються з символу двокрапки. Виглядає це так:type x.let x = 10 :type xКоманди інтерпретатора можна скорочувати до першої літери, але тільки якщо не відбувається колізії. Тому
:typeі:tодне і теж.Ця команда поверне нам
x :: Num p => pУ цьому рядку оператор
::схожий на=, але працює з типами, а не значеннями. За допомогою нього ми зможемо самі вказувати типи. Зліва від нього знаходиться вираз, а з права його тип. Що означає права частина у цьому випадку ми розберемо згодом, а зараз подивимось на те як уточнювати тип самостійно.let x = 10 :: IntТут ми явно вказуємо тип за допомоги оператора типізації. Тепер команда типу
:t xповерне нам такеx :: Int.Є шість основних, фундаментальних типів.
- Bool - Логічний (True, False)
- Char - Символьний ('\0' - '\1114111')
- Int - Знаковий цілочисельний (-9223372036854775808 - 9223372036854775807)
- Integer - Знаковий цілочисельний без обмежень)
- Float - Знаковий дробовий
- Double - Знаковий дробовий з подвійною точністю
Перейдімо від констант до функцій. Для прикладу візьмемо стандартну функцію
not. Вона приймаєboolі повертає інвертоване значення типуbool.not True -- Поверне False not False -- Поверне TrueТепер розберемо його тип
:t not not :: Bool -> BoolУ цьому випадку функція приймає один аргумент і саме його тип вказаний перед стрілкою, а після неї тип повернення. Але якщо буде кілька вхідних аргументів, то вони всі будуть переліченні через стрілки.
Для прикладу візьмемо оператор
&&. Щоб подивитись тип оператора потрібно взяти його у душки:t (&&).(&&) :: Bool -> Bool -> BoolПерші два
Boolце вхідні аргументи, а останній тип повернення. Саме через такі типи працює часткове застосування функцій. Візьмем(&& True)і побачимо що тип його(&& True) :: Bool -> Bool. Розташування аргументу значення не має.#програмування #haskell #типи #типізація #статична #строга #фукції #оператори #інтерпретатор #ghci #команди #type #types #typing #static #константи
-
CW: Функції та оператори в Haskell. Продовження.
Тепер перейдемо до створення власних функцій. Ми це вже робили у двох попередніх програмах. Там ми створювали функцію
mainяка не приймала жодних аргументів, але вони можуть приймати вхідні аргументи. Щоб створити функцію з аргументами потрібно перелічити їх до знаку=, таким чином розділяється оголошення віт тіла функції. Виглядає це такsumSquares x y = x ^ 2 + y ^ 2Викликати її потрібно так
sumSquares 5 3Назви функцій та її аргументів повинні починатись з літери у нижньому регістрі, або символ підкреслення. Після неї можна ставити літери у різних регістрах, символ підкреслення та одинарну лапку(
'). Лапку не можна ставити у назви ідентифікаторів в інших мовах.У Haskell можна створювати функції які спеціалізують інші функції. Для цього потрібно використати часткове застосування. Для прикладу візьмемо функцію
maxзі стандартної бібліотеки. Вона приймає два аргументи та повертає більший з них. Але іноді нам може знадобитись порівнювати різні числа з константою, наприклад нулем. У такому разі ми можемо створити функцію яка буде повертати нуль якщо передане її число більше нуля, і нуль якщо менше чи рівне.lowerLimit x = max 0 xАбо використати часткове застосування.
lowerLimit = max 0Виклик обидвох цих функцій не відрізняється.
lowerLimit 5#програмування #haskell #функції #оператори #чсткове #застосування #створення #оголошення
Я спочатку думав що буде невеликий допис, але довелось ділити на два коли дописав.
-
CW: Функції та оператори в Haskell. Продовження.
Тепер перейдемо до створення власних функцій. Ми це вже робили у двох попередніх програмах. Там ми створювали функцію
mainяка не приймала жодних аргументів, але вони можуть приймати вхідні аргументи. Щоб створити функцію з аргументами потрібно перелічити їх до знаку=, таким чином розділяється оголошення віт тіла функції. Виглядає це такsumSquares x y = x ^ 2 + y ^ 2Викликати її потрібно так
sumSquares 5 3Назви функцій та її аргументів повинні починатись з літери у нижньому регістрі, або символ підкреслення. Після неї можна ставити літери у різних регістрах, символ підкреслення та одинарну лапку(
'). Лапку не можна ставити у назви ідентифікаторів в інших мовах.У Haskell можна створювати функції які спеціалізують інші функції. Для цього потрібно використати часткове застосування. Для прикладу візьмемо функцію
maxзі стандартної бібліотеки. Вона приймає два аргументи та повертає більший з них. Але іноді нам може знадобитись порівнювати різні числа з константою, наприклад нулем. У такому разі ми можемо створити функцію яка буде повертати нуль якщо передане її число більше нуля, і нуль якщо менше чи рівне.lowerLimit x = max 0 xАбо використати часткове застосування.
lowerLimit = max 0Виклик обидвох цих функцій не відрізняється.
lowerLimit 5#програмування #haskell #функції #оператори #чсткове #застосування #створення #оголошення
Я спочатку думав що буде невеликий допис, але довелось ділити на два коли дописав.
-
CW: Функції та оператори в Haskell
Тепер прийшов час детальніше поговорити про функції й оператори. Мій "курс" розрахований на те що ви знаєте хоча б
Pythonкраще якщоC++, бо я найчастіше можу порівнювати саме з ним.На відміну від
Cподібних мов програмування у яких виклик функції відбувається у стиліf(x1,x2)деfце функція, аx1іx2це її аргументи. УHaskellсинтаксис виглядає такf x1 x2. Це ідентичні виклики, але з різною стилістикою. Якщо тут додати дужкиf (x1 x2), тодіx1вважатиметься ще одною функцією, якій передається один аргументx2і результат передасться функціїfяк єдиний аргумент. Тут дужки вважаються просто групуванням. Але все ще тут відсутня кома між аргументами, якщо її додатиf (x1, x2), то(x1, x2)буде кортежем і передаватиметься як один аргумент.Також у Haskell можна зробити так
(f x1) x2це буде те саме що й без дужок. Це називається часткове застосування функцій, тому виклик функції називається ліво-асоціативний. Знадобиться нам це трохи згодом.Тепер перейдемо до операторів. Вони викликаються в інфіксному стилі, на відміну від функцій, які викликаються у префіксному стилі. Виклик оператора виглядає та
2 + 2 * 2. Оператори мають пріоритети тому цей вираз, як і у математиці, дорівнюватиме6. Всі оператори є бінарними, окрім унарного мінуса, через це іноді доводиться обгортати відʼємні числа у додаткові дужки(-2) + 2, але у цьому випадку вони не обовʼязкові, натомість якщо поміняти їх місцями2 + -2тут виникне помилка, тому потрібно додати дужки2 + (-2).Оператори можна викликати у префіксному стилі, для цього потрібно перенести його на початок і обгорнути у дужки
(+) 2 4. У такому разі виклик виглядає як виклик функції. Але й функції можна викликати в операторному стилі для цього ми обгортаємо назву функції у зворотні лапкиx1 `f` x2.#програмування #haskell #функції #оператори #виклик #префіксний #інфіксний
Все не влазилось в один допис, тому продовження у відповіді на цей.
-
CW: Функції та оператори в Haskell
Тепер прийшов час детальніше поговорити про функції й оператори. Мій "курс" розрахований на те що ви знаєте хоча б
Pythonкраще якщоC++, бо я найчастіше можу порівнювати саме з ним.На відміну від
Cподібних мов програмування у яких виклик функції відбувається у стиліf(x1,x2)деfце функція, аx1іx2це її аргументи. УHaskellсинтаксис виглядає такf x1 x2. Це ідентичні виклики, але з різною стилістикою. Якщо тут додати дужкиf (x1 x2), тодіx1вважатиметься ще одною функцією, якій передається один аргументx2і результат передасться функціїfяк єдиний аргумент. Тут дужки вважаються просто групуванням. Але все ще тут відсутня кома між аргументами, якщо її додатиf (x1, x2), то(x1, x2)буде кортежем і передаватиметься як один аргумент.Також у Haskell можна зробити так
(f x1) x2це буде те саме що й без дужок. Це називається часткове застосування функцій, тому виклик функції називається ліво-асоціативний. Знадобиться нам це трохи згодом.Тепер перейдемо до операторів. Вони викликаються в інфіксному стилі, на відміну від функцій, які викликаються у префіксному стилі. Виклик оператора виглядає та
2 + 2 * 2. Оператори мають пріоритети тому цей вираз, як і у математиці, дорівнюватиме6. Всі оператори є бінарними, окрім унарного мінуса, через це іноді доводиться обгортати відʼємні числа у додаткові дужки(-2) + 2, але у цьому випадку вони не обовʼязкові, натомість якщо поміняти їх місцями2 + -2тут виникне помилка, тому потрібно додати дужки2 + (-2).Оператори можна викликати у префіксному стилі, для цього потрібно перенести його на початок і обгорнути у дужки
(+) 2 4. У такому разі виклик виглядає як виклик функції. Але й функції можна викликати в операторному стилі для цього ми обгортаємо назву функції у зворотні лапкиx1 `f` x2.#програмування #haskell #функції #оператори #виклик #префіксний #інфіксний
Все не влазилось в один допис, тому продовження у відповіді на цей.