Size: a a a

2021 April 08

IO

I O in Haskell
Со stack ghci --ghc-options "-fobject-code -O2" не надо ничего собирать, по :r все скомпилирует сам, можно даже -ddump-simpl/stg/asm дать и по :r смотреть
источник

к

кана in Haskell
окей, момент 2: собирать из репла удобнее еще и потому что это быстро, а с оптимизациями сборка идет ОЧЕНЬ долго
источник

KV

Kirill Valyavin in Haskell
repl-friendly code
источник

AA

A64m AL256m qn<co... in Haskell
не "надо полагаться", а нельзя не полагаться, нету такого практического варианта
источник

AA

A64m AL256m qn<co... in Haskell
на небольших данных возможно, а на больших невозможно в любом случае, репл ужасно тормозит
источник

AA

A64m AL256m qn<co... in Haskell
ну и из кода который 2 сек работает тот что 15 минут работает просто заниманием стг-ного стека все равно не получить
источник

AA

A64m AL256m qn<co... in Haskell
такое может быть от того, что асимптотика испортилась из-за того что ленивость не работает из-за полиморфизма, который дожил до выполнения из-за но-мономорфизм-рестрикшон в репле или по какой-другой причине - без оптимизаций их миллион
источник

AA

A64m AL256m qn<co... in Haskell
ну или наоборот какой-нибудь многогиговой материализацией которой из-за фьюжена не было в скомпилированном коде
источник

D

Dreamerinnoise in Haskell
у меня такое было, когда батч даунлоадер пилил себе
в репле всё умерло
источник

AA

A64m AL256m qn<co... in Haskell
короче говоря о многом надо думать чтоб писать запускаемый в репле код, и ЗАНИМАНИЕ СТЕКА тут дело десятое по важности, т.е. можно написать синтетический пример который выжрет 80% памяти и упадет на стандартных настройках ртс, а с бангом выполняется СЕКУНДЫ, но в реальном коде такое чет врятли встретится потому что обычно рекурсивные функции еще чет делают, не только аллоцируют на стеке и при таком числе итераций чтоб засрать всю память - они будут долго в репле работать и без использования стека
источник

MP

Misha Puzanov in Haskell
ну я писал код, который обмазанный бангами и стриктдатой жрет 1гб, без них жрет 3гб с -О2, выполняясь за примерно то же время, а в репле вообще дождаться результата было невозможно. То бишь ориентация на репл — это такоэ.
источник

[

[BRM]White Rabbit in Haskell
Прочитал как "политического варианта"
Совсем кукуха улетела, вызывайте санитаров
источник

MP

Misha Puzanov in Haskell
мне нужно пару десятков значений (целочисленных констант и строк, основном) иметь на тайп-левеле и на терм-левеле. Первое нужно для Options.Generic для описания дефолтных значений CLI параметров, а второе — чтобы инстанцировать эти дефолтные значения. И помимо того, мне нужен тайп-левел аналог show, чтобы дефолты в описания добавлять. Есть какие-нибудь хорошие примеры/библиотеки? Городить самому всякие страшные тайпфемили не особо хочется, вдруг кто-то уже сделал. Или там через type-level Map какой-нибудь, не знаю.
источник

JS

Jerzy Syrowiecki in Haskell
singletons слишком сложно?
источник

MP

Misha Puzanov in Haskell
ну на первый взгляд перебор, да
источник
2021 April 09

L

Lierdakil in Haskell
Вариант "в лоб" с тайпклассом не? Инстансы придётся руками (можно TH, но если их пара десятков проще руками)
источник

MP

Misha Puzanov in Haskell
мне по большому нужно иметь один источник для кода типа
config = Config {
  portNumber = 8080
 -- еще 20 таких
и для кода типа
data CLIOptions wrapped = CLIOptions {
   portNumber :: wrapped ::: Maybe Int <?>  "Port number (default is 8080)."
    -- еще 20 таких
....
во втором случае 8080 — это Symbol, это синтакис из Options.Generic.
То есть я могу спокойно обойтись и без генерализации этого дела, и смысл городить огород есть, только если это будет реально короче и изящнее. Пока что мой небольшой опыт с хаскельным тайплевелом говорит мне,  что ни "короче" ни "изящнее" тут не получится, но вдруг есть какие-то красивые варианты.
источник

MP

Misha Puzanov in Haskell
ну и тайплевелный show — это видимо совсем не вариант
источник

L

Lierdakil in Haskell
Ну почему не вариант. Кажется можно руками что-то сделать. Но навскидку не расширяемое.
источник

L

Lierdakil in Haskell
В Options.Generic есть тайп оператор <!> который аннотирует тип дефолтным значением (в виде Symbol). Symbol можно спустить на уровень значений с помощью symbolVal. Строку можно прочитать. Кажется достичь нужного результата можно, но дефолты все в виде Symbol и типобезопасность сомнительная
источник