to post messages and comments.

@qnikst:

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)

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

@qnikst:

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

Module.function : Module.Exception

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

@qnikst:

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

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

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

@ndtimofeev:

Что-то я забыл как устроено детектирование дедлоков в этом моём stm'е. Есть где статья про то как оно реализовано в GHC?

@segfault:

Hackage перестал тормозить и поиск обновили.

@qnikst:

давно не было 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

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

@qnikst:

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

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

@agr:

tweag.io

@agr:

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

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

@Renha:

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

@max630:

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

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

@ndtimofeev:

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

@trapdoor:

Где бы теперь посмотреть изменения API в base?

@trapdoor:

ghc.haskell.org

Ждём теперь хотя бы в nightly стакане.

@blaze:

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

@killy:

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

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

@ndtimofeev:

fpcomplete.com — что укусило Сноймана, что у него пакет разделён на пакет определяющий класс и пакет с сиротками? Это рождение ребёнка так повлияло?

@ndtimofeev:

arxiv.org — всё равно не пойму за каким дьяволом они тащут туда Profunctor и почему им не хватает Functor и Applicative.

@blaze:

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

@gbdj:

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

@gbdj:

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

@den-po:

Ирония в сторону названия понятна, но если серъёзно — Haskell, например, больше brainfuck чем brainfuck )

@qrilka:

WTF отвечаешь в твиторе dons-у про новость BBC об Архангельске(!)

@segfault:

В exceptions определен ` MonadThrow <hackage.haskell.org> []`

@agr:

jobsquery.it

@blaze:

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

@blaze:

что-то питончик у меня парсит и жует CSV вдвое быстрее хаскеля. Надо профайлить, наверняка где-нибудь налажал.

@blaze:

вот так ненадолго отвлечешься на PHP и уже не можешь сообразить, как execState скрестить с runExceptT

@ndtimofeev:

Мне кажется или Снойман пишет про штангу?

@SannySanoff:

Тот момент когда написано Either, а читаешь Ether

@qnikst:

foreign import ccall unsafe "zmq.h zmq_ctx_term"
c_zmq_ctx_term :: ZMQCtx -> IO CInt


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

After interrupting all blocking calls, zmq_ctx_term() shall block until the following conditions are satisfied:
только не говорите, что кто-то серьезно использует эти байндинги

@max630:

medium.com неужели так неимоверно сложно эту хуйню бежать как-нибудь в интерпретаторе?

@ndtimofeev:

А есть какие-то более другие способы решения проблемы orphan instances на уровне языка или манипуляций с библиотеками в других языках с интерфейсами?

@segfault:

gist.github.com
Как бы мне вот такой псевдокод писать более красиво и композабельно? Можно взять ResourceT вместо Trans, но он при выходе из монады запустит мне `cleanupRes` а мне этого как раз не надо, поскольку я тут не ресурсы выделяю, а делаю serious business штуки, которые хочется безопасно отменить в случае любых фейлов, а если фейлов не было, то не чистить. И желательно в обратном порядке (последнее cleanup action вызвается первым). Ситуация осложняется большой вложенностью вызовов функций и невозможностью в одном месте сделать такое вот дерево из `catchAll`.

@rufuse:

Чего-то у меня мозг вытекает уже через уши. Расскажите почему происходит то, что происходит, а?

type family Migratable (rs :: [RevPair]) :: Constraint where
Migratable (rp1 ': '[]) =
( TopLevel (GetSchema (Head (rp1 ': '[])))
, Known (Sing (GetSchema (Head (rp1 ': '[])))) )
Migratable (rp1 ': rp2 ': tl) =
( Known (Sing (GetSchema (Head (rp1 ': rp2 ': tl))))
, MigrateSchema
(GetSchema (Head (Tail (rp1 ': rp2 ': tl))))
(GetSchema (Head (rp1 ': rp2 ': tl)))
, TopLevel (GetSchema (Head (rp1 ': rp2 ': tl)))
, Migratable (Tail (rp1 ': rp2 ': tl)) )

parseAndValidateRevPairs
:: forall proxy rps
. ( Known (Sing (GetSchema (Head rps))), Known (Sing rps), Migratable rps )
=> proxy rps
-> J.Value
-> ParseResult (JsonRepr (GetSchema (Head rps)))
parseAndValidateRevPairs _ v =
let
rss :: Sing rps
rss = known
stv :: Sing (GetSchema (Head rps))
stv = sGetSchema $ sHead rss
stl :: Sing (Tail rps)
stl = sTail rss
in case stl of
SNil -> parseAndValidateJsonBySing stv v
SCons _ SNil -> parseAndValidateJsonBySing stv v
SCons (SCons _) -> migrate <$> parseAndValidateVersionedJsonByVersions stl v

error:
• Could not deduce (MigrateSchema
(GetSchema n0) (GetSchema (Head rps)))
arising from a use of 'migrate'
from the context: (Known (Sing (GetSchema (Head rps))),
Known (Sing rps),
Migratable rps)
bound by the type signature for:
parseAndValidateRevPairs :: (Known (Sing (GetSchema (Head rps))),
Known (Sing rps), Migratable rps) =>
proxy rps
-> Value
-> ParseResult (JsonRepr (GetSchema (Head rps)))
at /Users/dr/workspace/schematic/.stack-work/intero/intero26044q4W.hs:(124,1)-(129,50)
or from: Tail rps ~ (n0 : n1)
bound by a pattern with constructor:
SCons :: forall a0 (z0 :: [a0]) (n0 :: a0) (n1 :: [a0]).
z0 ~ (n0 : n1) =>
Sing n0 -> Sing n1 -> Sing z0,
in a case alternative
at /Users/dr/workspace/schematic/.stack-work/intero/intero26044q4W.hs:141:5-23
or from: n1 ~ (n2 : n3)
bound by a pattern with constructor:
SCons :: forall a0 (z0 :: [a0]) (n0 :: a0) (n1 :: [a0]).
z0 ~ (n0 : n1) =>
Sing n0 -> Sing n1 -> Sing z0,
in a case alternative
at /Users/dr/workspace/schematic/.stack-work/intero/intero26044q4W.hs:141:14-22
• In the first argument of '(<$>)', namely 'migrate'
In the expression:
migrate <$> parseAndValidateVersionedJsonByVersions stl v
In a case alternative:
SCons (SCons _)
-> migrate <$> parseAndValidateVersionedJsonByVersions stl v

@ndtimofeev:

Накидать генератор линз с полиморфными апдейтом на генериках сходу не получилось. Challenge accepted! В нынешнем представление Generic'ов мне категорически нехватает информации о полиморфной составляющей типа. Есть Generic1, но это конечно совсем не то.

@ndtimofeev:

Никак не могу к этому привыкнуть: почему Data.Functor, но Control.Applicative и Control.Monad? Или почему Data.Lens хотя линзы van Laarhoven'а ни разу не data?

@blaze:

а какие у нас общепринятые техники в STM чего-нибудь посчитать-попроверять, и кроме нового state выплюнуть наружу еще и лог "случилось то, случилось се"?

@ndtimofeev:

Про линзы van Laarhoven'а написано много где и довольно хорошо. А вот про призмы как-то невнятно. Мне собственно нужны не они, а partial lens, которые где-то описывались как Choice f => (a -> f b) -> s -> f t. Что бы посмотреть на эту тему?

@ndtimofeev:

Для функтора Const x a определён Applicative (через Monoid x) и не определён Alternative?