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

Всі налаштування робляться через його команду :set. До прикладу, часто може знадобитися переглядати типи функцій, чи їхніх значень після виконання. Робиться це командою :type передаючи певну конструкцію, але можна увімкнути автоматичний друк типів при виконанні кожної інструкції командою :set +t. Після цього виконання буде виглядати так:

ghci> 4 4 it :: Num a => a ghci> 'N' 'N' it :: Char ghci> 2 + 2 * 4 10 it :: Num a => a

Тепер нам не потрібно виконувати окремі команди, щоб побачити значення та тип результату.

Також можна змінити підказку (prompt) щоб не дивитись кожнісінький раз на те що ми й так знаємо, а саме що ми у ghci.

ghci> :set prompt "> " > "It's a String" "It's a String" it :: String >

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

> :set prompt "[%l] %s> " [7] Prelude>

Так вже цікавіше.

Є ще одна штучка котра може нам іноді знадобитись при тестах.

[1] Prelude> f = do <interactive>:1:5: error: [GHC-82311] Empty 'do' block Suggested fix: Perhaps you intended to use NondecreasingIndentation [2] Prelude> :set +m [3] Prelude> f = do ghci| putStrLn "Привіт всім хаскелятам та хаскелищам!" ghci| [6] Prelude> f Привіт всім хаскелятам та хаскелищам! [7] Prelude>

:set +m дозволяє писати багато рядкові конструкції.

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

#ukrhaskell #haskell #ghci #налаштування #prompt #set

Social.Net.Ua

a #GHCi session with a home unit for each selected component. Until now, support in the REPL was essentially limited to reloading modules to get feedback about changes. Almost all other commands were unsupported when using multiple home units.
https://well-typed.com/blog/2025/06/ghci-multiple-home-units/
Making GHCi compatible with multiple home units

Boost your Haskell productivity with Multiple Home Units in the repl

YouTube

cabal.project (equivalent to #cargo workspace)
use the #GHCi repl to call the functions defined in #Rust.
GHCi can only load dynamic libraries, not static ones.
#cabal

https://github.com/yvan-sraka/cargo-cabal

GitHub - yvan-sraka/cargo-cabal: A tool that helps you to turn in one command a Rust crate into a Haskell Cabal library!

A tool that helps you to turn in one command a Rust crate into a Haskell Cabal library! - yvan-sraka/cargo-cabal

GitHub

Was soll das für function composition sein, wenn nicht mal

| (compose flip flip) == identity

stimmt und mir dafür Arity-Error entgegen wirft.

Kurz in #ghci geprüft, und glücklich geworden.

#Racket #DrRacket #Scheme #Haskell

I think I have just found the best prompt for #GHCi
#Haskell #Programming

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

$ runghc main.hs

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

Social.Net.Ua

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

Social.Net.Ua

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

Social.Net.Ua

GHCiTUI Update: Modules, Tracing, Resizing, Speed Ups! Also please help by endorsing me on Hackage.

It's been a while since I've given an update on this project.

The project is now open source (https://github.com/CrystalSplitter/ghcitui)

And hopefully in the next few weeks it'll be on Hackage! You can help me if you're a Hackage maintainer by endorsing me: https://hackage.haskell.org/user/CrystalJRAW/endorse

#haskell #ghc #ghcitui #ghci #programming #opensource

GitHub - CrystalSplitter/ghcitui: A Terminal User Interface for the Glasgow Haskell Compiler Interactive Mode

A Terminal User Interface for the Glasgow Haskell Compiler Interactive Mode - GitHub - CrystalSplitter/ghcitui: A Terminal User Interface for the Glasgow Haskell Compiler Interactive Mode

GitHub