#ghci — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #ghci, aggregated by home.social.
-
CW: Налаштування GHCI, інтерпритатора :haskell:
Під час вивчання
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файл у домашній теці, або у поточній. Просто запишіть у нього всі необхідні команди й ви спаслись. -
CW: Налаштування GHCI, інтерпритатора :haskell:
Під час вивчання
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файл у домашній теці, або у поточній. Просто запишіть у нього всі необхідні команди й ви спаслись. -
CW: Налаштування GHCI, інтерпритатора :haskell:
Під час вивчання
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файл у домашній теці, або у поточній. Просто запишіть у нього всі необхідні команди й ви спаслись. -
multiple home units in #ghci
https://www.youtube.com/watch?v=B1WFMave-r4 -
multiple home units in #ghci
https://www.youtube.com/watch?v=B1WFMave-r4 -
multiple home units in #ghci
https://www.youtube.com/watch?v=B1WFMave-r4 -
multiple home units in #ghci
https://www.youtube.com/watch?v=B1WFMave-r4 -
multiple home units in #ghci
https://www.youtube.com/watch?v=B1WFMave-r4 -
CW: Швидкий запуск програми на :haskell:
Під час розробки часто потрібно перезапускати програму перевіряючи її поведінку. Але робити це за допомоги інтерпретатора
ghciзапускаючи функцію не завжди зручно, та й збирати компіляторомghcі запускати бінарник також. Тому для зручності було зробленоrunghc. Це команда яка компілює код і зразу його виконує не зберігаючи у файл.$ runghc main.hs#ukrhaskell #haskell #ghc #ghci #runghc #запуск #програмування
-
CW: Швидкий запуск програми на :haskell:
Під час розробки часто потрібно перезапускати програму перевіряючи її поведінку. Але робити це за допомоги інтерпретатора
ghciзапускаючи функцію не завжди зручно, та й збирати компіляторомghcі запускати бінарник також. Тому для зручності було зробленоrunghc. Це команда яка компілює код і зразу його виконує не зберігаючи у файл.$ runghc main.hs#ukrhaskell #haskell #ghc #ghci #runghc #запуск #програмування
-
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 #виклик #функції #функцій #префіксна #інфіксна #форми
-
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 #виклик #функції #функцій #префіксна #інфіксна #форми
-
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 #константи
-
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 #константи
-
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
-
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
-
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
-
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
-
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
-
Try getting #haskell's #cabal or #stack to run on that iMac. I got cabal 3.2 installed, but it refuses to run: it crashes with "illegal instruction 4". Luckily #ghc 8.8.3 and its #ghci 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... :(
-
Try getting #haskell's #cabal or #stack to run on that iMac. I got cabal 3.2 installed, but it refuses to run: it crashes with "illegal instruction 4". Luckily #ghc 8.8.3 and its #ghci 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... :(
-
Try getting #haskell's #cabal or #stack to run on that iMac. I got cabal 3.2 installed, but it refuses to run: it crashes with "illegal instruction 4". Luckily #ghc 8.8.3 and its #ghci 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... :(
-
Try getting #haskell's #cabal or #stack to run on that iMac. I got cabal 3.2 installed, but it refuses to run: it crashes with "illegal instruction 4". Luckily #ghc 8.8.3 and its #ghci 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... :(
-
So here's something interesting about #Microsoft's #WSL: I can run #ghci, kick off a lengtht process, then shut down the WSL instance in which it started, and then ghci keeps running. How odd is that?
-
So here's something interesting about #Microsoft's #WSL: I can run #ghci, kick off a lengtht process, then shut down the WSL instance in which it started, and then ghci keeps running. How odd is that?