Чтобы добавлять сообщения и комментарии, .

@agr:
agr

jobsquery.it

@blaze:
blaze

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

@blaze:
blaze

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

@blaze:
blaze

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

@ndtimofeev:
ndtimofeev

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

@SannySanoff:
SannySanoff

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

@qnikst:
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:
max630

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

@ndtimofeev:
ndtimofeev

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

@segfault:
segfault

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

@rufuse:
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:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

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

@blaze:
blaze

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

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

Мальчики Никита и Серёжа пишут приложение. Гуйня на WX, а бэкенд на хаскеле. Вопрос в том как из треда на хаскеле передать сообщение в тред на крестах так, чтобы не 1) блокировать эвентлуп крестофреймворка, 2) полить из крестов MVar 3) unix-сокет.

@qnikst:
qnikst

/path/blablabla/foobar.hs:332:58: error:
• Couldn't match expected type ‘BlahBlah’ with actual type ‘t’
‘t’ is untouchable
inside the constraints: reply ~ BlahBlah
bound by a pattern with constructor:

а какая ошибка больше всего бесит вас?

@segfault:
segfault

pbs.twimg.com
Wow! Not bad ...

@rufuse:
rufuse

а есть для сабжа нормальные(компилятся из литералов, работают с Text) регулярки, чтобы как hackage.haskell.org но не зависели бы от сишных либ?

@qrilka:
qrilka

уже GHC 8.2 на носу, а GHCJS всё ещё не может обрести поддержку 8.0.2 со стаком

@rufuse:
rufuse

Можно ли на сабже заиметь type-directed search населяющих типы-синглтоны термов как-нибудь? В голову приходит библиотека constraints, т.к. это пруф-серч по сути, но дальше мысль не идет.

@ndtimofeev:
ndtimofeev

А зачем parseJSON завёрнут в Parser от attoparsec? В этом же решительно никакого смысла: Value за тебя уже попарсили и отдают аргументом, ничего полезного внутри монады ты уже сделать не можешь, отстрелить ногу — запросто. Что вообще происходит?

@qnikst:
qnikst

github.com

знал ведь наверное, но забыл

@qnikst:
qnikst

зачем и когда нужно пользоваться asyncExceptionFromException?

@qnikst:
qnikst

А кто-нить активно пользовался service pattern

@qnikst:
qnikst

В есть например у меня

newtype Foo m a = Foo { runFoo :: ReaderT Q m a }

он является MonadTrans и в нём легко лифтить все вещи. Но при этом реально в проекте используется

type FooM a = Foo ConcreteMonad a

чтобы выполнять действия ConcreteMonad я могу воспользоваться lift. Все нормально, но при этом создание полиморфного стека немного напрягает, т.к. огорчает inliner. А если я
сделаю

newtype FooM a = FooM { runFooM :: ReaderT Q ConcreteMonad a }

то уже у меня не будет lift и или придётся воодить класс для действий ConcreteMonad или делать liftConcreteMonad, а и то и то печально, что делать-то?

@ndtimofeev:
ndtimofeev

А threadWaitWrite работает с Fd чтобы намекнуть что для винды не имплементировано? Или просто из ненависти к человечеству как threadDelay с Int'ом?

@provaton:
provaton

Ок, раз #2870836/4, то вместо гугла буду спрашивать сюда.

Написал я парсер yaml'а, примерно как вот этот — github.com


Как лучше всего реализовать необязательные ключи? Чтоб при отсутствии определенных элементов использовалось некое дефолтное значение?

@max630:
max630

reddit.com

@provaton:
provaton

Что-то опять зачесались руки попробовать на хаскелле пописать. И задача как раз есть умеренной сложности. Но знаю, что ведь тупой слишком, и только зря время потеряю, но все равно хочется...

@qnikst:
qnikst

а по какому принципу на stepic винды решения людей, а то например на haskell, там вечно какие-то 6 рандомных решений с пафосными комментариями, учитывая, что всего проходит человек 100.

@killy:
killy

hell yeah

Челледж "Завершить курс на 100%, чтобы можно было с чистой совестью сказать, что он говно" — выполнен.

Но я скажу мягче: курс сырой и несбалансированный. Неудачный формат изложения и множество методических просчётов.

Рад только за тех, кто пришёл задачки порешать. Должно быть неплохо для освежить в голове некоторые темы.

@agr:
agr

github.com
nstack тоже набирает.. (всё больше и больше стэков)
Посмотрел на их концепцию. Переусложнена, для ETL процессов можно и нужно сделать проще. ETL/IO знает, как.

@thefish:
thefish

"Стой, погоди" — прерывает Крис. "А разве не… разве не надо здесь декларацию типа? Ну хотя бы для функций?"
Ты мило улыбаешься. "Хаскель динамически типизированный, интерпретируемый язык".
Крис выглядит так, как будто проглотил лягушку.
"Смотри, я покажу. Давай проверим, равняется ли один одному."

habrahabr.ru

@qnikst:
qnikst

@blaze если инстанс может быть написан, то он должен быть написан, иначе будет куча неумных людей людей и напишут кривой инстанс.

Если логичный инстанс единственный, то тогда вообще не должно быть никаких вопросов, как например для `(,) а`.

@qnikst:
qnikst

Есть
data Foo =
A1 :: forall x . TVar (Either E x) -> ...
A2 :: forall x . TVar (Either E x) -> ...
...

во всех конструкторах есть Either E, у меня есть метод который процессит это Foo, каким бы образом вытащить из него tvar так чтобы туда можно было положить Left E, и не важно какой там x?

@qnikst:
qnikst

Кто-то ведь уже делал тут такую штуку?
есть GADT вида:

data Foo reply where
C1 :: Param1 -> Param2 -> Foo Reply1
C2 :: Param2 -> Param1 -> Foo Reply2
...

есть фунции вида:
handleC1 :: Param1 -> Param2 -> IO Reply1

хочется как-то подешевле в терминах бойлерплейта прицепить эти хэндлеры к C1? Ещё было бы прикольно подешевле их вызывать. Как?

@ndtimofeev:
ndtimofeev

А почему find ищет через Foldable, а lookup — через список?

@ndtimofeev:
ndtimofeev

Ну и коль скоро сегодня меня волнуют только извращения: можно ли из STM транзакции сделать atomicModifyIORef и расчитывать что его в самый неподходящий момент не прибьёт retry?