home.social

#оператори — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #оператори, aggregated by home.social.

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

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

  3. 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 #константи

  4. 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 #константи

  5. 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 #функції #оператори #чсткове #застосування #створення #оголошення

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

  6. 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 #функції #оператори #чсткове #застосування #створення #оголошення

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

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

    Все не влазилось в один допис, тому продовження у відповіді на цей.

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

    Все не влазилось в один допис, тому продовження у відповіді на цей.