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

Створюються вони за допомоги бінарного оператора (,).

> (,) 'c' True ('c',True)

При цьому в нас виходить двох елементний кортеж, часто його ще називають парою. Але кортежі можуть бути й довші, або коротші.

Найкоротший кортеж - це порожній кортеж.

> () ()

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

> (,,) 4 'a' False (4,'a',False) > (,,,) 4 'a' False "Haskell" (4,'a',False,"Haskell")

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

> (4, 'a', False, "Haskell") (4,'a',False,"Haskell")

Тепер перейдемо до їхніх типів.

Нагадую: простори імен типів та всього іншого відокремлені.

Тип кортежів це ().

> :t () () :: ()

Якщо це не порожній кортеж, то й тип не порожній.

> :t ('c', True) ('c', True) :: (Char, Bool)

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

> p = (1,2) > fst p 1 > snd p 2

Ці функції працюють тільки з парами, і реалізовуються через зіставлення.

fst (x,_) = x snd (_,y) = y

#ukrhaskell #haskell #tuple #кортежі #типи #програмування

Гетерогенна система — Вікіпедія

Linux для кожного

https://kyiv.tube/w/uEKFmSkAYCxag5rKh3R6KZ

tt_bez_222_ua

PeerTube

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)

Параметризований поліморфізм у

Окрім виразу 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)

Вираз let in у

#щоденник | експерименти з yq.

практичне використання yq для спрощення обробки дописів із yaml-заголовками.

tl;dr — півскрипта можна замінити одним рядком… але воно в 20 разів повільніше (бо версія yq в arch — на python'і).

https://codeberg.org/tivasyk/blog.text/src/branch/master/posts/2025/2025-06-01-yq.markdown

про #програмування на #bash #українською

@rada

Social.Net.Ua

Тести, дебаг та обережність

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

Спочатку я рухався дуже обережно — рядочок тут, перевірочка там. Щоб нічого не поламати. Згодом збагнув, що поки я запускаю тести локально, я нічого ніколи не поламаю, та можна робити будь-які зухвалі зміни, аби швидше знайти причину.

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

В коді було багато горутін, які не повідомляли про своє завершення. (Це не такий вже й поганий патерн, коли на кінці виклику ти залишаєш частину роботи на рівночасне виконання.) Чи можуть вони псувати стан для інших тестів? Та додай між тестами очікування у 5 секунд, щоб всі горутіни точно завершились.

Незрозуміло було, де саме відбувається забруднення "чистого середовища". То й розстав логів хоч після кожного рядка.

А наприкінці виявилось, що я забув, що go test ./... запускає пакети тестів паралельно. І тільки з опцією -p 1 - ні. Так що на цей раз моя проблема мала дуже просте рішення — яке я не бачив через власні переконання. (І ще через купу інших можливих причин, які довелося відкинути.) 😅

#Програмування

Асемблер та машинний код

В продовження поста про мови, якими пишуться інші мови, все ж залишається питання: а що в самому низу? Які інструкції розуміє компʼютер — що таке машинний код? Та чим він відрізняється від асемблера (мови програмування)?

Це взагалі цікаво, бо машинний код не складається з "найпростіших" інструкцій, тобто він не є "в самому низу" (хоча що це взагалі означає?) Зокрема, інструкції Intel x86 взагалі можуть містити в себе цілу підпрограму, як-от мені колись допомогла інструкція POPCNT для підрахунку бітів. І вона не найскладніша. Але — машинний код це найнижчий рівень, на який може залізти програміст, тому не більше й не менше, він розмежовує програмне та "апаратне".

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

(Те, що він є "двійковим", мало що змінює. В компʼютері все "двійкове". Як є редактор для тексту, так само може бути редактор для машинного коду. І є — наприклад, ImHex це вміє.)

Також в машинному коді немає коментарів, та кожен хто колись виправляв проблеми з package.json знає, наскільки важко без них. Ну але кожен знає, що це теж незручно, але можливо.

Але чого в машинному коді дійсно не вистачає, це імен. Та ти недооцінюєш, наскільки імена важливі в програмуванні! Бо в машинному коді всі посилання як на дані (змінні), так і на код (розгалуження, цикли, процедури) відбуваються за адресою. А адреса — річ не стала. Захотіли додати інструкцію до гілки — та вже всі адреси нижче треба зсувати. Додали змінну — треба знайти, куди її пристроїти. До того ж — ніяких назв, а одні чисельні адреси (ще й інколи — абсолютні, інколи — відносні). Все це — надзвичайно ускладнює розробку.

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

#Програмування

Post by stendap_sogodni, @stendap_sogodni@shevtsov.me

# Якою мовою пишуться мови програмування? Отримав (від дружини!) таке цікаве запитання. Бо, власне, чи є тут якась драбина мов, та якщо є — то де вона закінчується? Драбина якщо є, то дуже коротка. По-перше, **в ідеалі засоби виконання мови пишуться тою ж самою мовою.** В цього очевидна перевага: що...

shevtsov.me

Якою мовою пишуться мови програмування?

Отримав (від дружини!) таке цікаве запитання. Бо, власне, чи є тут якась драбина мов, та якщо є — то де вона закінчується?

Драбина якщо є, то дуже коротка. По-перше, в ідеалі засоби виконання мови пишуться тою ж самою мовою. В цього очевидна перевага: щоб розвивати мову, не потрібно знати іншу.

Втім, як вийти з цього парадоксу курки та яйця? Тут зазначу, що є два різновиди мов. Компільовані мови перетворюються в машинний код, який вже не залежить від самої мови. А значить, достатньо першу версію компілятора написати іншою мовою, а згодом, маючи скомпільований компілятор, переписати його "рідною". Так було з С, C++, Go, Rust, Haskell тощо.

Інтерпретовані мови завжди виконуються в контексті іншої програми — інтерпретатора. Тому інтерпретатор доведеться написати компільованою мовою — за власні підтяжки себе не витягнеш. Наприклад, Ruby та Python написані на C - матері всіх мов. Але більша частина інструментів та бібліотек все одно пишеться рідною мовою.

Є ще мови з віртуальною машиною — це дещо посередині. Їхній код компілюється не в машинний, а в код віртуальної машини (байт-код). Та компілятор цей пишеться рідною мовою. А сама віртуальна машина — повноцінною компільованою мовою. Наприклад, машини Erlang та Java написані знову на C.

Отже, виходить так: зрілі компільовані мови написані самі собою, а інтерпретовані — зазвичай на C/C++. Мови із віртуальною машиною - 50 на 50.

#Програмування

Мова програмування С як основа

Я мимохідь сказав, що серед всіх мов С найважливіша для розуміння компʼютера. Так склалося, що у C особливе положення: це фундамент та спільна база …

OpenAI представила Codex – нову ШІ-систему, що допомагає програмістам писати код швидше та ефективніше. Дізнайтеся, як працює цей "ШІ-парний програміст" та які його перспективи. #OpenAI #Codex #ШІ #Програмування

Детальніше: https://newsua.us/node/6902

OpenAI представила Codex: ШІ-помічник для програмістів

Компанія OpenAI, відома своїми проривними розробками у сфері штучного інтелекту, оголосила про випуск Codex – нової ШІ-системи, спеціально розробленої для допомоги розробникам програмного забезпечення. Codex є нащадком потужної мовної моделі GPT-3, але пройшов додаткове навчання на величезному масиві коду та природної мови.

OpenAI, розробник ChatGPT, веде переговори про придбання популярного ШІ-інструменту для програмістів Windsurf за $3 млрд. Дізнайтесь деталі потенційної угоди. #OpenAI #Windsurf #ШІ #Програмування #Поглинання

Детальніше: https://newsua.us/node/6672

OpenAI веде переговори про придбання інструменту для програмістів Windsurf за $3 млрд

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

NewsUA US