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

@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 — хвост или значение. И вот если честно, у меня не получается. Написать закрытую типофамилию, которая из типа входного списка собирает тип выходного — легко. А вот привязать это всё к классам, категорически не могу.

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

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

quickCheck $ frequency [(0, pure True)]

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

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

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

@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?

@ndtimofeev:
ndtimofeev

Есть у меня 4-гидрокси-3,5-динитрофенилацетат. Хочу из него получить 1,4-диметокси-3,5-динитробензол. То есть оторвать ацетил и заметилировать гидрохинон по обоим свободным фенолам. С одной стороны интуиция подсказывает мне взять раствор субстрата (например в ацетоне), взять карбонат калия, взять диметилсульфат, смешать всё и оставить крутиться на ночь. С другой стороны автор статьи в которой я подсмотрел получение самого 4-гидрокси-3,5-динитрофенилацетат, метилирует его диазометаном. Чего мне делать очень не хочется. И никому хотеться не должно. Что бы мне со всем этим сделать?

@ndtimofeev:
ndtimofeev

Чатт, посоветуй ebuild для примера того как кусок проприетарного говна извлекается из rpm'а и помещается в систему. Очень надо.

@ndtimofeev:
ndtimofeev

Мне кажется или xml-conduit в свежем хэкедже сломан то ли через зависимость от blaze-markup, то ли через зависимость от blaze-html?

@ndtimofeev:
ndtimofeev

Господа java-программисты, по этому бэктрейсу можно сказать чего не хватает этому куску говна скомпилированному в 2014ом году?

ERROR: Uncaught Exception: java.lang.ExceptionInInitializerError
        at com.bric.swing.QDialog.createOKButton(Unknown Source)
        at com.bric.swing.QDialog.createDialogFooter(Unknown Source)
        at com.bric.swing.QDialog.showDialog(Unknown Source)
        at com.bric.swing.QDialog.showDialog(Unknown Source)
        at com.treestar.lib.dialogs.SDialogs.notify(Unknown Source)
        at com.treestar.lib.dialogs.SDialogs.notify(Unknown Source)
        at com.treestar.lib.dialogs.SDialogs.notify(Unknown Source)
        at com.treestar.flowjo.main.Main.javaCheck(Unknown Source)
        at com.treestar.flowjo.main.Main.initMain(Unknown Source)
        at com.treestar.flowjo.main.Main.main(Unknown Source)
Caused by: java.lang.NullPointerException
        at com.treestar.lib.FJCommand.<clinit>(Unknown Source)
        ... 10 more

Нет, исходников у меня нет.

@ndtimofeev:
ndtimofeev

Прочитал две простыни про то как охуенно использовать QuickCheck. Захотелось написать тестов, но для этого придётся написать кода. Придётся работать.

@ndtimofeev:
ndtimofeev

Уже давно споры общественности не утихают относительно того можно или нельзя использовать generic-random для того чтобы выводить инстансы Arbitrary для Generic-типов и нужно ли по этому поводу форкнуть QuickCheck (давно пора, там феерический срач и костыли для компиляторов, которые сто лет как сдохли). Вместе с тем Generics позволяет например влёгкую во время компиляции ограничить область применения функции только произведениями типов, нерекурсивными суммами и так далее. Для остального можно накатать Custom Type Error класса пиши инстанс сам и всё.