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

@blaze:
blaze

смотрю на то, что нахреначил автор dbus там в коде и думаю, стоит ли пытаться на себя перетащить maintenance этого пакета или послать все нахрен и сделать биндинги к клиентской библиотеке gnome-keyring. Он там держит свою библиотеку для тестов, свои биндинги к libxml для парсинга XML... как представлю, что все это надо будет выкинуть нахер и поменять на поддерживаемое — грустно становится.

@segfault:
segfault

Чот я туплю, а у нас в бейз разве нет Eq1 и Ord1? А где правильнее взять?

@qnikst:
qnikst

есть хацкельный кусок данных, который нужно будет сериализовать, есть сишная функция, которая будет это использовать, есть варианты:
1. Сериализатор скажет нужный размер, я выделю в haskell память при помощи Foreign.Marshal.Alloc.allocaBytes и запишу туда все передам указатель в сишную функцию.
2. Сериализатор скажет размер я вызову сишную функцию, где на стеке выделю нужный размер и позову callback в haskell чтобы он туда сериализовал функцию
3. Сериализатор скажет размер и выдаст сишную функцию (это не реально так?) которая сериализует значение и далее как в 2 только без callback в haskell.

Что из этого лучше всего? Поидее 1. самое простое, но обидно, что будет выделяться память в haskell куче, когда все можно бы было провернуть на стеке, с другой стороны учитывая какой стек в haskell, но нужно будет колдовать как с gmp. А по поводу 2 vs 3 непонятно, что выдет дороже... В общем фигнёй какой-то страдаю.

@ndtimofeev:
ndtimofeev

Больше всего мне в Generic'ах не хватает возможности доказать что у оложенного типа тоже есть Generic (или нет) и поветвиться по этому.

@ndtimofeev:
ndtimofeev

nponeccop.livejournal.com

@segfault:
segfault

gist.github.com
Нашел забавную ситуацию, когда надо использовать MultiParamTypeClass с фундепом вместо ассоциированной тайпфемили.

@segfault:
segfault

hackage.haskell.org
А где вот этот вот тип A есть с инстансами отдельно от оптпарса?

@blaze:
blaze

баг в компиляторе быстренько починили. Мне, правда, уже и не надо :)

@ndtimofeev:
ndtimofeev

λ> type family Null :: Constraint where Null = ()
λ> type AddShow a b = (Show b, a)
λ> :kind! FoldL AddShow Null [Int, Char]
FoldL AddShow Null [Int, Char] :: Constraint
= (Show Char, (Show Int, () :: Constraint))
λ>

Так и живём.

@ndtimofeev:
ndtimofeev

Есть произведение типов data T a b = T a b. На месте любого из параметров находится либо другое произведение T, либо значение очень произвольного типа. Я хочу упорядочить этот бордак в подобие гетерогенного списка, где на месте a будет значение, а на месте b — хвост или значение. И вот если честно, у меня не получается. Написать закрытую типофамилию, которая из типа входного списка собирает тип выходного — легко. А вот привязать это всё к классам, категорически не могу.

@qnikst:
qnikst

Кому книжка нужна?

@qnikst:
qnikst

У тут есть:
data Foo = Bar | Baz
есть класс
class FooBool (t::Foo) where toBool :: proxy t -> Bool
instance FooBool 'Bar where toBool _ = False
instance FooBool 'Foo where toBool _ = True

теперь везде где ни попади таскается этот тупой констреинт, который не может быть неудовлетворён. Как починить?

@segfault:
segfault

Ну что опять? // Разговаривает с тайпчекером.

@segfault:
segfault

github.com
Похоже на фреймворк для создания своего CI

@ndtimofeev:
ndtimofeev

Реквестирую примеры работы Data.Constraint.Deferrable из constraints для мальчиков-дебилов.

@ndtimofeev:
ndtimofeev

Написал таки тупой генератор случайных локальных изменений в случайном дереве: генерирую набор Word8, при помощи них перемещаюсь по дереву до случайного узла, а затем переписываю этот узел на случайный узел того же типа сгенерированный из пары Int'ов (из одного генерируем QCGen, из другого — size для Gen'а). До этого проделывал тоже самое при помоще unsafePerformIO $ generate arbitrary и долго удивлялся почему тесты валятся.

@blaze:
blaze

а скажите, я тут чего-то хочу глупого и выношу компилятору мозг, или это правда баг? gist.github.com

Идея в том, что у класса C есть ассоциированый трансформер, и я хочу для N унаследовать Functor, Applicative и Monad через этот трансформер. С Functor получается, а на Applicative компилятор валится. ghc 8.0.2

@ndtimofeev:
ndtimofeev

Довольно забавно, но вот такой тест:

quickCheck $ frequency [(0, pure True)]

Очень плохо воспроизводится.

@ndtimofeev:
ndtimofeev

А кто-нибудь уже предложил сделать литералы синглетонами по умолчанию? С одной стороны это позволяло писать код из которого можно было бы выводить type-level числа и строки, с другой стороны преодолело бы идиотскую ситуацию когда значение написано в коде, но компилятор о нём как бы ничего не знает.

@blaze:
blaze

CloudProvider.hs:15:1: error:ghc: panic! (the 'impossible' happened)
(GHC version 8.0.2 for x86_64-unknown-linux):
No skolem info: f1_arOd[sk]

@ndtimofeev:
ndtimofeev

Примерно 70-80% ошибок, которые я нахожу QuickCheck'ом — ошибки сериализации/десериализации. Реквестирую библиотеку, где ты декларируешь спецификацию на тип в виде типа из которого генерируется функции для сериализации/десериализации.

@ndtimofeev:
ndtimofeev

Есть у меня тип data Wrap where Wrap :: C a => a -> Wrap, где C в достаточной степени небо и Аллах. Внутри Wrap сгенерированная случайно сумма-произведений, которую я использую для тестирования программы. Проблема состоит в том, что самого дерева обычно недостаточно: нужно ещё одно того же типа, или функция из типа в тип и вот это вот всё. Можно генерировать всё это явным образом внутри свойства, но это имеет ряд недостатков. Возникла мысль превратить Wrap в гетерогенный непустой список, где первый элемент генерируется как сейчас (через жопу), а прочие при помощи штатного arbitrary с учётом того, что их тип как-то свзяан с типом первого элемента. Вопрос в том, как должен выглядеть этот список.

@ndtimofeev:
ndtimofeev

Есть у меня кусок кода, который берёт значение алгебраического типа, сравнивает его с другим значением того же типа и делает ПАТЧ. Решил я потыкать его Quickcheck'ом. Для этого худо бедно научился генерировать деревья произвольных типов (на самом деле случайные сумма-произведения). Однако теперь мне нужны более менее случайные, но затрагивающие не большие участки дерева изменения. Видимо надо генерировать случайный зиппер, чтобы сначала проходить кусок дерево, а потом менять поизвольную ноду.

@blaze:
blaze

вот что бесит, так это когда есть f :: b -> a и g :: c -> d -> b, пишешь потом f . g, а оно не работает с мутной диагностикой. Каждый месяц вляпываюсь, наверное.

@ndtimofeev:
ndtimofeev

Ой… SmartCheck оказывается помер.

@ndtimofeev:
ndtimofeev

В догонку к #2862204

isDiscard :: AnException -> Bool
(discard, isDiscard) = (E.throw (E.ErrorCall msg), isDiscard)
 where
  msg = "DISCARD. " ++
        "You should not see this exception, it is internal to QuickCheck."
  isDiscard e =
    case E.fromException e of
      Just (E.ErrorCall msg') -> msg' == msg
      _ -> False

Ну вот примерно так всё там внутри и выглядит.

@ndtimofeev:
ndtimofeev

А я чего-то не понимаю? Почему в base нет функции вида a -> Proxy a?

@ndtimofeev:
ndtimofeev

Мне приснилось расширение, которое позволяло в классе реализовывать дефолтный инстанс другого класса?

@ndtimofeev:
ndtimofeev

QuickCheck инструмент невероятно полезный (чуть не сказал удобный). И тем не менее каждый раз когда я влезаю внутрь там всегда какие-то костыли, заборы, коровники... Мама, мы в аду, мама. Пробовал я как-то тестировать им робота (в основном генерировать серии беспорядочных перемещений). Мне тогда казались жутко кривыми манипуляции с заворачиванием стейта генератора случайных значений и прочими прыжками. Сейчас заглядываю в код самого QuickCheck'а, а там примерно тоже самое. Это я к чему: а пионеры не напионерили свой quickcheck с generic'ами и отсутствием совместимости с nhc?

@blaze:
blaze

объясните мне поведение тайпчекера: gist.github.com
Не догоняю, почему newtype ему помогает.

@segfault:
segfault

А как в 2кей17-ом принято удалять неиспользуемые зависимости в .cabal файле?

@blaze:
blaze

делая закачку файлов на amazon через aws, я ознакомился с conduit. Теперь, переписывая всё это на amazonka, я ознакомлюсь еще и с линзами. Код со всеми этими &, ^. и ?~ становится все больше похож на perl :-/

@qnikst:
qnikst

Если вы встретите человека, который говорит что Haskell должен быть строгим по умолчанию — предложите ему пописать на Idris недельку

@blaze:
blaze

написал я credential-store, молодец. А в lts-8 взял и выпал dbus. Ну ё-моё.

@blaze:
blaze

храните пароли в сберегательной кассе! Нужно кому? github.com

@Shchvova:
Shchvova

А как принято сейчас учить Haskell? Какую книжку почитать что бы она не была прям совсем устаревшей?

@Shchvova:
Shchvova

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

@Darwin:
Darwin

Обзор фреймворков: danpalmer.me

@blaze:
blaze

а есть каноничный способ сдампить Integer в ByteString в big-endian формате? Я функцию-то напишу, но вдруг уже все придумано до нас.

@qnikst:
qnikst

НЕНЕВИЖУ! НЕНАВИЖУ этих highlevel программистов, которые делают охренено умные высокоуровневые обёртки к низкоуровневым либам, при этом обрезая очень важные возможности!

Вам это не нужно говорили они! это усожняет интерфейс говорили они! вы сделаете все медленным говорили они!!!!!!!!!!