#ghci

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

Під час вивчання 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

2025-08-29

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.
well-typed.com/blog/2025/06/gh

2024-09-11
शून्यताwigalois@dresden.network
2024-07-27

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

Screenshot of shell with:
λx. ghci
GHCi, version 9.2.5: https://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /data/data/com.termux/files/home/.config/ghc/ghci.conf
[Prelude] 𝜆𝑥. :! head -1 ~/.config/ghc/ghci.conf
:set prompt "\ESC[34m\STX[%s] \ESC[1;35m\STX\x1D706\x1D465. \ESC[m\STX"
 [Prelude] 𝜆𝑥.
Найменшенькийbalaraz@social.net.ua
2024-03-16

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

$ runghc main.hs

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

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

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

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

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

2024-01-16

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 (github.com/CrystalSplitter/ghc)

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: hackage.haskell.org/user/Cryst

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

2023-06-05

I've been working on a #Haskell #GHCi TUI, and I just got the interface of it working! I like being able to step and jump around with hotkeys, it's so neat.

Ænðr E. Feldstrawaeveltstra
2020-12-31

Try getting 's or to run on that iMac. I got cabal 3.2 installed, but it refuses to run: it crashes with "illegal instruction 4". Luckily 8.8.3 and its run just fine. Installing stack failed, but it did manage to load a bunch of much-needed packages, so I can work on my projects. I guess I have to learn how to load packages without cabal or stack... :(

Ænðr E. Feldstrawaeveltstra
2020-07-04

By Odin, it worked! Installing 8.8.3 for means it was possible to successfully install the package manager, which means the and packages could get downloaded from , and this time did not complain about a missing libHSold-locale library! wOOt!

Ænðr E. Feldstrawaeveltstra
2020-04-14

So here's something interesting about 's : I can run , kick off a lengtht process, then shut down the WSL instance in which it started, and then ghci keeps running. How odd is that?

Ænðr E. Feldstrawaeveltstra
2020-04-14

Hey, programmers, how do I stop executing when I have it executing an infinite loop? Running inside . Didn't respond to ^c or :q. I shut down the WSL instance but that didn't cut the CPU usage...

2020-04-06

#TIL: #Hugs for #haskell does read literal scripts, but #GHCI does not. Woe is me: ghci is the norm.

Ænðr E. Feldstrawaeveltstra
2020-04-06

: for does read literal scripts, but does not. Woe is me: ghci is the norm.

Ænðr E. Feldstrawaeveltstra
2020-02-07

Who here uses to write and compile computer software source code? It behaves different from the , which makes it difficult to follow all kinds of tutorials. Drop me a hint, please?

2019-07-10

@MasseR Not properly - I did try `cabal v2-repl` to test some things but not sure how it interacted with executables.

Moreover there might be some issues with #GTK and #OpenGL vs #thread local storage, but probably not insurmountable.

More important will likely be splitting the package from one fat `et.cabal` with #library and #executable, into separate packages for library and executable - this will save `cabal v2-install` rebuilding the whole library every time I change only the executable's source.

#haskell #cabal #ghc #ghci

Client Info

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