#ukrhaskell

Найменшенькийbalaraz@social.net.ua
2025-10-17

error та undefined це не звичайні функції. Крім того, що вони поліморфні, та ще й переривають виконання.

Перша приймає рядок з повідомленням помилки й виводить його на екран, а друга просто перериває обчислення.

Їхній поліморфізм полягає в типі повернення, й потрібен для того, щоб можна було їх викликати будь-де.

λ> error "Упс, щось не так."
*** Exception: Упс, щось не так.
CallStack (from HasCallStack):
  error, called at <interactive>:4:1 in interactive:Ghci1
λ> undefined
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  undefined, called at <interactive>:5:1 in interactive:Ghci1

#ukrhaskell #haskell #error #undefined #поліморфізм #програмування

Найменшенькийbalaraz@social.net.ua
2025-10-14

Окрім виразу let in є ще схожа конструкція where. Вона виконує ту ж функцію, але трохи по інакшому.

g n = x+2*x where x = n^3+2

На перший погляд, змінилась тільки послідовність оголошення та використання функцій, і це майже правильно. Ключова відмінність у, тому що let in це вираз, а where конструкція. Тому друге можна використовувати там де не можна перше, наприклад при використанні кількох визначень з охоронними виразами чи зіставленнями.

f x | x > 0 = y * 2
    | x < 0 = y / 2
  where y = cos x^2

На жаль приклад дуже не дуже, але є що є.

Тут оголошені функції після whare можна використовувати в усіх визначеннях f, й навіть в охоронних виразах. let in такого не дозволяє.

#ukrhaskell #haskell #where #letin #вираз #конструкція #підфункції #охоронні_вирази #програмування

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

Часто у вичисленнях потрібно використовувати одне й теж значення у різних місцях і коли це не якийсь літерал, а вираз, то простіше дати йому назву і використати її. Саме для цього служить вираз let in.

f x =
  let y = x+2*x
  in y+1/y

Це спрощує, і написання, і розуміння коду. У цьому випадку одразу видно що використовується одне значення і не потрібно порівнювати візуально. Функція повертає значення яке стоїть після in.

Ми можемо оголошувати одразу кілька функцій у секції let.

f x =
  let
    a = x*2
    b = x^2
  in a + b/2

У let можна створювати не тільки константи, а й функції з аргументами.

f x = let g y = y*2 in g x + 2

Читати такий код не дуже зручно тому його можна, або розбити на кілька рядків, або додати дужки.

f x = let {g y = y*2} in g x + 2

#ukrhaskell #програмування #haskell #letin #let #in #вираз #підфункції

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

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

Для прикладу візьмемо вираз if then else, бо інші ми ще не вивчали.

f x = if x > 0 then True else False

У цьому виразі немає великих значень чи формул, але ми розглянемо його для простого розуміння. Розбити його на окремі рядки ми можемо так.

f x =
  if x > 0
  then True
  else False

Або так.

f x =
  if x > 0 then
    True
  else
    False

Кількість пробілів не має значення. Головне що їх було, або таж кількість, або більше. Якщо відступ відсутній, то це означає що починається нове оголошення.

!! Один символ табуляції завжди вважається як 8 пробілів.

#ukrhaskell #програмування #haskell #відсупи #табуляція #синтаксис #syntax #spaces #tab

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

Під час розробки часто потрібно перезапускати програму перевіряючи її поведінку. Але робити це за допомоги інтерпретатора ghci запускаючи функцію не завжди зручно, та й збирати компілятором ghc і запускати бінарник також. Тому для зручності було зроблено runghc. Це команда яка компілює код і зразу його виконує не зберігаючи у файл.

$ runghc main.hs

#ukrhaskell #haskell #ghc #ghci #runghc #запуск #програмування

Viktor Tokariev 🇺🇦victor_tokarev@twiukraine.com
2024-03-14

@balaraz розкажіть, як ви зараз думаєте, навіщо оцей хаскель потрібен, які у нього переваги над імперативними мовами? (btw тег #ukrhaskell прикольний, буду користуватись)

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

Через те що у Haskell аргументи функції не вкладаються у дужки при спробі передати результат однієї функції в іншу потрібно використати дужки для групування.

foo bar x    -- Функції передаються два аргументи bar і x
foo (bar x)  -- Функції bar передається аргумент x і її результат підставиться як один аргумент функції foo

У цьому простому прикладі все виглядає просто і зрозуміло, але якщо у нас був би складніший вираз з іншими дужками все виглядало б не так зрозуміло.

Для полегшення додали спеціальний оператор зниження пріоритету. Складається він з одного символу $. Використати його ми можемо тут підставивши між функціями.

foo $ bar x

Результат буде той же що й з дужками.

Цей оператор має праву асоціативність і найнижчий пріоритет. Перевірити це ми можемо в інтерпретаторі.

> :i ($)
($) :: (a -> b) -> a -> b 	-- Defined in ‘GHC.Base’
infixr 0 $

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

($) f x = f x

#ukrhaskell #програмування #haskell #оператор #$ #пріоритет #функції

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

За допомоги зіставлення ми можемо розділити виконання на кілька гілок залежно від умови, але ця умова може тільки перевіряти на рівність. Коли нам потрібно використати складнішу умову на допомогу приходять охоронні вирази.

Оголошуються ці вирази після аргументів відділяючись вертикальною лінією.

f x | x > 0 = x

Цю функцію можна викликати тільки на додатних числах.

Також ми можемо обʼєднати зіставлення й охоронні вирази.

f 0 = 0
f x | x > 0 = 2 / x

Якщо нам потрібно виконувати різні дії залежно від різних умов ми можемо оголошувати кілька різних функцій.

f x | x > 0 = x * 2
f x | x < 0 = x * (-2)

Якщо спробуємо викликати цю функцію на значенні 0, то отримаємо помилку.

*** Exception: Demo.hs:(18,1)-(19,22): Non-exhaustive patterns in function f

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

У такому оголошенні є мінус, а саме те що ми повторюємо назву функції та її аргументи, тому ми можемо спростити це оголошення ось так.

f 0 = 0
f x | x > 0 = x * 2
    | x < 0 = x * (-2)

Це абсолютно рівні оголошення, тільки тут ми ще додали зіставлення для нуля.

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

Client Info

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