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

@ndtimofeev:
ndtimofeev

В догонку к #2852982. Я на самом деле тупой, а автор — котик. Он берёт не два моля боргидрида, а «большой избыток» при помощи которого быстро восстанавливает избыток бензальдегида в системе предотвращая повтороное образование имина. Это 1) правда работает 2) нереально круто 3) просто как валенок. Таким образом можно вводить в первичные амины один заместитель без страданий с защитными группами или использования тяжёлой артилерии. Жалко что с водным формальдегидом скорее всего не взлетит, а безводного — не бывает.

@ndtimofeev:
ndtimofeev

Пытаюсь уговорить себя не делать logger nullary type class'ом. Получается с трудом.

@ndtimofeev:
ndtimofeev

Есть планировщик шины представленный клиентам обёрткой вокруг Async'а и TQueue с тасками. Конструктор обёртки в IO запускает тред в котором крутится планировщик, который работает тоже внутри IO. Теперь я хочу заменить IO на (MonadIO m, MonadMask m, MonadLogger m) => m и не могу придумать как пропихнуть сферическую монаду в вакууме в форк.

@ndtimofeev:
ndtimofeev

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

@ndtimofeev:
ndtimofeev

Нет ничего более беспомощного чем живой человек редактирующий SMILES на глаз. Я знал что рано или поздно мы перейдём и на эту гадость.

@ndtimofeev:
ndtimofeev

Что мне грозит за попытку хранить в узлах ADT значения не того boxed типа скастованного к нужному boxed типу при помощи unsafeCoerce? Кроме презрения товарищей?

@ndtimofeev:
ndtimofeev

elegant-nmr.com — вот эта вот штука рискует быть примером революции в индустрии (в данном случае в органическом синтезе) при полном отсутствии революции в технологии. Если коротко, то любой человек, который занимается синтезом, не сидит на ЯМР-спектрометре в институте и имеет лишние^W500 евро, купит это устройство рано или поздно. Теперь не коротко.

Краткий экскурс в историю проблемы. ЯМР один из немногих методов что-то понять о структуре вещества, которое ты сварил (есть ещё рентгеноструктурный анализ кристалла и масспектр высокого разрешения). Традиционно ЯМР-спектрометры делают на сверхпроводящих магнитах и представляют собой обычно огромную катушку проволоки, спрятанную в ещё более огромный сосуд дюара в котором жидкий азот охлаждает жидкий гелий. Что значит огромный? Небольшой современный ЯМР спектрометр с удовлетворительной разрешающей способностью (в итоге мы имеем на руках спектр, на котором наблюдаем пики, которые в зависимости от структуры вещества могут быть расположены очень плотно и в зависимости от разрешающей способности прибора быть раздельными пиками или невнятной кашей) по размеру сопоставим с серверной стойкой. Хороший современный ЯМР-спектрометр с хорошей разрешающей способностью по высоте занимает два этажа жилого дома, а для тех, которые находятся на переднем краю технологии строят отдельные здания. Стоимость ЯМР-спектрометра безумна вполне типичным для научного оборудования образом, но тут есть одно маленькое отличие: в него надо регулярно подливать жидкий гелий (обычно раз в год) и жидкий азот (обычно раз в месяц) в количестве сотен литров в зависимости от размеров (и качества) дюара. Причём даже если вы вообще не пользуетесь прибором, снимаете по спектру раз в несколько месяцев, поддерживать температуру сверхпроводящего магнита всё равно придётся. В противном случае он быстро-решительно превратит свою энергию в тепло, испарит весь азот-гелий и превратится в кирпичь. Возможно его удастся после этого перезапустить (пусконаладка после квенча сопоставима с ценой нового прибора). Возможно — нет. В какой-то момент до химиков дошло, что для работы с низкомолекулярными соединениями (всё что меньше килодальтона) им не нужна такая высокая ларморова частота достающаяся столь дорогой ценой и на рынки стали появляться относительно небольшие приборы с частотой 200-300Mhz и сравнительно небольшими дюарами (и ценой). Несколько лет назад я видел прибор на очень мощных постоянных который имел ларморова частоту в 100Mhz и умел снимать только довольно хреновые одномерные H1 спектры, но зато его уже можно было поставить в вытяжной шкаф и снимать реакционную массу онлайн.

И тут приходят какие-то хмыри и выкатывают ЯМР спектрометр на постоянных магнитах о 40Mhz ларморовой частоты и такого размера, что его можно спрятать в рукав куртки. С такой разрешающей способностью он вообще не способен снять нормальный протонник. Но хмыри говорят:
— Да кому нужны ваши сраные протонники в 2016ом году? Снимайте двумерную C13 — H1 или H1 — H1 корреляцию! За счёт растягивания по второй координате перекрывающиеся пики разрешаться!
— Но как же с протонами, которые приделаны не к углероду?
— Да и хуй с ними! Положа руку на сердце, ты всё равно как правило их не видишь из-за обменного эффекта с растворителем.
Вообщем я джва года ждал такую игру, все мои коллеги ждали такую игру и так далее. 500 евро? Не смешите меня, я больше денег в год трачу на ЯМР-as-a-service.

@ndtimofeev:
ndtimofeev

У меня тут регионопроблемы. Пусть у меня есть функции вида:

doWith :: Shit res -> (forall s. res s -> Reg s ()) -> IO ()

traverseRes :: (Generic (res s), Magic (Rep (res s))) => res s -> Reg s ()

По отдельности всё хорошо, но если сделать что-то вроде:

\hnd -> doWith hnd traverseRes

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

@ndtimofeev:
ndtimofeev

— Что за кривой английский у Боуи в Girl Loves Me с чёрной звезды?
— Это надсат.

@ndtimofeev:
ndtimofeev

Всего два года страданий, бесконечных обсуждений и наш робот сварил свои первые четыре пептида (на самом деле восемь, просто четыре ещё не охарактеризованы). На самом деле собранная система состоит из наспех набросанных костылей, нуждается в очевидных механизмах защиты и вообще соотносится с оригинальным проектом как самокат с автомобилем, собранный на базе шасси от недостроенного автомобиля потому что команде разработчиков срочно потребовалось доехать из пункта А в пункт Б. Тем не менее система гораздо более автономна чем те, что получались у нас прежде и вообще я рад.

@ndtimofeev:
ndtimofeev

Устраиваешься по неудобнее, вставляешь себе ствол пистолета в рот и начинаешь плакать в надежде что кто-то придёт тебя отговаривать. Вдруг внезапная нотификация от жаббер-клиента. Смотришь, а там haskell-exception от робота на пол страницы текста. Ба-бах!

@ndtimofeev:
ndtimofeev

То ощущение, когда хочешь запостить процесс деблокирования пептида на смоле, а потом понимаешь, что администрация ресурса забанит тебя за пропоганду инйекционной наркомании.

@ndtimofeev:
ndtimofeev

boxed cat and unboxed cat

@ndtimofeev:
ndtimofeev

Охуительно. GHC в какой-то момент просто перестал линковать инстанс в динамическую библиотеку. Такое ощущение что он просто решил вынести его целиком в файл интерфейса, а потом забыл это сделать. Причём на другой машине тот же GHC работал нормально. 4 часа удаления сандбоксов, .cabal, .ghc, неба и аллаха, обновления cabal'а… Всё в пустую. Пофикшено изменением внешнего интерфейса модуля (тупо добавил функцию, которая ничего не делает, но экспортируется). Доброй всем ночи.

@ndtimofeev:
ndtimofeev

Можно как-то попросить cabal repl подгружать статические версии библиотек из sandbox'а?

@ndtimofeev:
ndtimofeev

Очень надеюсь что вся администрация jabber.ru из-за который на bitcheese.net ввели капчу, из-за которой теперь нужно поебаться чтобы зарегистрировать jid через клиент, сначала захлебнётся в луже собственной блевотины, а потом сгорит в аду. Спасибо за внимание.

@ndtimofeev:
ndtimofeev

А можно как-то в ghci импортировать часть символов из модуля? А то попытка использовать совместно Data.List и Data.List.NonEmpty делает меня грустным.

@ndtimofeev:
ndtimofeev

В догонку к #2852988. То ощущение что я хочу анонимные типы. То есть типофункция кейз которой определён как конструктор, а другой как вычисление.

@ndtimofeev:
ndtimofeev

Проебал ночь машинного времени потому что запустил программу в тестовом режиме. Как бы мне сделать :set prompt в ghci-скрипте на основание значения let-биндинга из того же скрипта?

@ndtimofeev:
ndtimofeev

Были у меня красивые типы-устройства параметризованные фантомным параметром прибивающим их к регион-подобной монаде. Внутри были СВОЙСТВА (Property) — волшебные переменные (парметризованные кучей параметров главным обрзом типами f и a, где a тип значения который присваивается переменной, f a — тип произвольного состояния в котором может находится аспект устройства связанный со свойством) операции над которыми потокобезопасно отражались на хардварной перефирии, также прибитые к региону. Это в принципе работает хорошо, но охренительно неудобно. Ну то есть если обойти все свойства устройства можно при помощи Generic, но куда их деть кроме как собрать в какой-то гомогенизированный список? Тогда густо обмазавшись магией функций на типах я родил следующий концепт: устройства парметризованы ещё одним фантомным параметром, который определяет значение данного типа либо как runtime-представление устройства (если параметр равен Runtime), либо как просто коллекцию значений (если он Info p). Вместо Property мы везде лепим типофункцию, которая на основе параметра представления либо возвращает Property, либо p с которым пришёл Info (кайнд у p и Property — одинаковый). Теперь в принципе из региона можно возвращать коллекцию значений соответствующих свойствам устройства. И всё было бы хорошо, но… я не могу придумать имя для типофункции. Более того мне кажется что СВОЙСТВО это скорее более общий вариант, то есть это она Property, а чем является в таком случае Runtime-переменная я теряюсь сказать. Ну и ещё один вопрос меня терзает: фантомный параметр, которым мы прибиваем представления устройств к региону просто совершенно не нужен Info версии того же типа. Возникает нездоровое желание просто переиспользовать его для разных кейзов, но я пока не придумал как и что я при этом отстрелю себе в плане регионов.