to post messages and comments.

Офисное барахло то падает, то взлетает, по ощущениям тяжело даётся, но эскалации отбили.. По сайту прогресс остановился, т.к. ряд действий вовлек меня в череду задачек, цель которых — себя поучить лишний раз и подумать о своём поведении. Одни даются хорошо, другие — хуже.. Потихоньку покрываю интерфейсы разные..

Добавил haskell, т.к. столкнулся с тем, что в пакете HDBC-odbc по умолчанию модуль пытается считать DSN из C:\Windows\System32\odbcad32.exe, а не C:\Windows\SysWoW64\odbcad32.exe. Сил никаких нет, хочу заполучить данные из MS Access, попутно простреливая себе колени. Есть идеи, куда нажать?

Курс Functional Programming In Haskell (University Of Glasgow) на FutureLearn на поверку оказался вообще ни о чём. Черновик курса, набор недописанных плохо упорядоченных материалов. Лекторы неинтересные.

а какое хорошее имя можно придумать для

:: Alternative f => f (STM (IO a)) -> IO a

а то часто используется по коду и наверное надо вынести в либу

hPutStr :: Handle -> BL.ByteString -> IO ()
hPutStr hdl lbs = wantWritableHandle "Data.ByteString.Lazy.hPutStr" hdl $ \hdl__ ->
  BL.foldrChunks (go hdl__) (commit hdl__) lbs
 where
  go hdl__ (S.PS ps s l) rest = do
   unless (l == 0) $ withForeignPtr ps $ \p -> do
    _ <- bufWrite hdl__ (p `plusPtr` s) l True
    pure ()
   rest
  commit hdl__ =
   case haBufferMode hdl__ of
    BlockBuffering _   -> do return ()
    _line_or_no_buffering -> do flushWriteBuffer hdl__
                  return ()

В догонку к #2877381. Теперь я не только не понимаю зачем линзы (на самом деле призмы) обмазаны Profunctor, но ещё и не понимаю зачем нужен Profunctor, если есть Arrow. Стрелки в принципе делают всё то же самое.

amap :: (Category p, Strong p, Choice p, Profunctor p) => p a b -> p [a] [b]
amap = make . it . tasty where -- (p ||| amap p) where
  -- make :: Profunctor p => p (Either () (a,[a])) (Either () (b,[b])) -> p [a] [b]
  make = dimap view build
    where
     build = either (const []) (uncurry (:))
     view = maybe (Left ()) Right . uncons
  -- it :: (Choice p, Profunctor p) => p (a,[a]) (b,[b]) -> p (Either () (a,[a])) (Either () (b,[b]))
  it = right'
  -- tasty :: (Choice p, Category p, Strong p) => p a b -> p (a,[a]) (b,[b])
  tasty p = p ||| amap p
  (|||) x y = first' x >>> second' y

меняем it на right' и все перестает компилироваться, почему?

Каждый раз хочу оператор для \meval err -> maybe (Left err) Right meval. Почему в куче base нет оператора для перехода от Maybe к Either? В принципе можно обмазаться error и catch, но получится говно.

If you or a loved one are suffering from nondeterministic runtime behavior, call now to see if Haskell is right for you.

Side effects may include:
— not being paged at night
— laziness
— being trapped in the IO Monad

neilmitchell.blogspot.ru — Вот тут Mitchell'у пишут, что static pointer'ы не стабильны и могут меняться от сборки к сборке, что довольно сильно ограничивает применимость его идеи. Это меня в принципе не удивило, но потом я вспомнил, что static pointers extension рожали в муках для нужд cloud haskell с целью гонять по сети указатели на функцию. Так вот вопрос: как им там живётся с такими гарантиями стабильности?

Prelude> let x = (id True, id undefined)
Prelude> :sprint x
x = _
Prelude> let x = (True, id undefined)
Prelude> :sprint x
x = _
Prelude> let x = (True, undefined)
Prelude> :sprint x
x = (,) True _
Prelude> let x = (True, undefined::Int)
Prelude> :sprint x
x = (True,_)
Prelude> let x = (True, False)
Prelude> :sprint x
x = (True,False)

кто-нить может мне объяснить почему вывод именно такой?

Хочу плагин к GHC, который вычисляет какие исключения может бросать функция. Причем, какой-нить тупой, ей даешь на вход текстовый файлик со списком:

Module.function : Module.Exception

он используя эту информацию собирает код и генерит на выходе файлик дополненый всеми собранными функциями, это же реально?

haskell не для продакшена и нигде не используется.

Тем не менее вчера встретил знакомого, который недавно подался в программисты, работает в какой-то фирме, которые делают что-то с магистральными каналами и всякий софт для этого. Так вот, он там похвастался, что у него есть знакомый живой хацкелист, на что ему сказали, тащи его сюда, у нас тут есть пачка кода написанного ещё давно, который работает, но никто не понимает как, пусть объяснит.

Вот так неожиданно haskell оказывается в продакшенах, посмотрю код потом, может подробности расскажу.

давно не было haskell тут:

MAIN = go (replicate 100000000 1)
where
go [] = return ()
go xs0 =
let ~(xs, ys) = span (>0) xs0
in do print $ foldl' (+) 0 xs
go ys

вот такая программа, если запустить её прибивает OOM Killer.
меняем $ на $! и она работает в constant space.

Просмотр stg показывает совсем мало разницы, в падающем случае unboxed tuple возвращаемый span снова боксится:

let blabla = case GHC.List.$wspan lvl1_r71d wild_s71y of _ [Occ=Dead] {
(#,#) ww1_s71D [Occ=Once] ww2_s71E [Occ=Once] ->
(,) [ww1_s71D ww2_s71E];

в обычном просто дальше идёт код.

Так же в падающем варианте идёт ещё одна аллокация:

let {
sat_s71M [Occ=Once, Dmd=<L,1*U>] :: GHC.Base.String
[LclId, Str=DmdType] =
\s srt:SRT:[r2vu :-> GHC.Show.$w$cshowsPrec3, r71e :-> go_r71e] []
case ds1_s71B of _ [Occ=Dead] {
(,) xs_s71G [Occ=Once] _ [Occ=Dead] ->
... бла-бла-бла тут развернутый fold и show

я понимаю почему падающий жрёт больше, но я не понимаю почему это не больше на какой-то множитель, почему ничего не освободжается.

<rubber-duck-mode>
А как бы задавать неявные методы для решения ОДЕ, так чтобы пользователь мог задать стратегию решения?
После размышления, у меня ощущение, что если в явном методе я могу возвращать (в простом случае без доп структуры):
phi :: x -> f x -> f x
то для неявного я должен писать:
phi :: x -> (f x, f x) -> f x

где теперь мне на вход подается начальная координата и первое приближение, и в ответ я выдаю набор следующих координат. Вроде в этом случае вся свобода, которая должна быть остается в руках у пользователя, можно и начальное приближение удобным способом выбирать, и решать хочется ли fixed point или newton iteration или вообще заанролить метод на нужную глубину.
</rubber-duck-mode>

Хочу систематизировать лапшу из команд и конфигов:
— для билда (с докером или без) и деплоя (scp/rsync)
— на локальную машину, тестовый стенд и продакшн.

Смотрю в сторону Shake. Как оно в целом? Или что другое посоветуете?

Интересный текст richardhaskell.com
коротко, хардварная имплементация раз в 10 быстрее чем реализация на ЯП, Си как обычно тормозит, FORTH-процессоры это ня, надо зопейлить таковой на своей плисине, можно попробовать уходить в крайности RISC/CISC и посмотреть что — лучше, а что — хуже.

reddit.com

prettyCurrentCallStack, called at compiler/utils/Outputable.hs:1133:58 in ghc:Outputable callStackDoc, called at compiler/utils/Outputable.hs:1137:37 in ghc:Outputable pprPanic, called at compiler/prelude/KnownUniques.hs:104:5 in ghc:KnownUniques

Других коллстеков у меня для вас нет

При попытке вкатить cabal-install обнаружилась острая нехватка различных ебилдов. Пока восполнял её, обнаружил, что у echo в вебне hackage'а указаны одни констрейнты, а в тарболе с кодом — другие.

Обсуждаем во внутреннем тредике мысль, что не надо в библиотеках совать руки в signal handlers. Совсем не надо, вот даже если очень-очень хочется все равно не надо, потому что никогда не знаешь, кто и как их еще использует, и кто из вас двоих в конце останется без пальцев.
А тег потому что обсуждаем с smarlow, и мне хочется этим похвастаться :)

Dear FutureLearner,
You previously registered interest in the course, Functional Programming in Haskell: Supercharge Your Coding.
You can now join the course, which will start on 18 September 2017:
futurelearn.com
The FutureLearn Team

Я уж думал, вот оно... Что-то как-то очень заранее предупредили.

или я чего-то не понимаю, или у меня waitProcess забивает болт на threadCancel. С другой стороны, это и логично, он же в wait4 висит и на МДПХ вертел все эти хаскельные рантаймы.

В продолжение #2877060 youtube.com Короче нормально все в Хаскеле. По другому, но чуть ли не навороченнее. Там есть тупой промежуточный язык с типизованными лямбдами в который после типчекера транслируются все хаскелевые абстрактные навороты. А уже потом когда надоест гонять оптимизатор по кругу можно преобразовать в C, либо еще в какую фигню. stackoverflow.com

Знаю что есть вполне себе определения парсера и типчекера Haskell в терминах Haskell. Но вот чтоб полностью и рантайм и компилятор определить — вроде бы нет такого. Идея в том что бы не писать ни строчки С-шного кода руками, а генерить его заведомо корректным под конкретную архитектуру. Спрашивается WTF, что помешало ребятам сделать так с самого начала?

сравнил Streaming из cassava с ее же Incremental, вызываемом в tail recursive функции, хранящей хвост lazy bytestring в State. Время прожевывания гига данных снижается с 13 секунд до 9, maximum residency с 70Mb до 300Kb. Ну охуеть. А ведь код похож один в один. ЧЯДНТ, библиотеки как-то без оптимизации сумели собраться?