Alexander
оно мне день жизни съело
Leonid 🦇
()<$ вместо void лучше
Alexander
тоже недостаточно же?
Alexander
это ж не const () <$!> ?
Leonid 🦇
Нет.
Alexander
но и const () <$!> тоже может быть недосточно
Alexander
в общем я сделал заменую when на Control.Monad.when если у нас там m ()
Alexander
посмотрим
Alexander
уже второй раз блин на это натыкаюсь, но первый был не важным и я тупо забил
Nikolai
Leonid 🦇
Я помню народ просил полиморфный when и им отцы объясняли что на самом деле они не хотят
Alexander
@fizruk31337 вот я помню что давно было, но вроде потом = выпилили
Alexander
@lonokhov вот я бы тоже так сказал, у меня глаза каждый раз за него цеплялись, но доводов не было
Alexander
или какой-нить INLINE 10 на него повесить
Nikolai
Alexander
вот мне кажется что лет 7 назад решили унифицировать
Alexander
RULE для своих реализаций SPECIALIZE для автоматических
Nikolai
да, видимо так
Nikolai
а какая разница для тебя?
Alexander
SPECIALIZE проще выглядит
Alexander
если бы он умел я бы им воспользовался, но смыслу оно правильнее подходит
Nikolai
{-# RULES
"myFunc/Int" myFunc = myFuncInt
#-}
Nikolai
как-то так вроде, не сложно, мне кажется
Alexander
там когда типы надо выписывать явно всегда для меня путаница
Nikolai
ну для юзкейса типа specialize всегда же можно выписать тип в специализированной реализации
Nikolai
в примере выше — для myFuncInt
Alexander
чет у меня правило не сработало сходу
Alexander
@fizruk31337 в общем-то я ж как спросил правило сразу написал, если бы сказали что в SPECIALIZE есть поменял бы
Serghei
http://prntscr.com/gzqwvr
Serghei
победил
Serghei
Serghei
именно внимательный взгляд на эту грамматику все расставил по полочкам
Dmitry
@serghei_k что-то нагуглилось по if-elsif-else ?
Serghei
да я просто посмотрел на elseif и понял что это и есть case
Serghei
а break у меня и так реализован в контексте loop/for и пр
Alexandr
Привет! Кто читал Окасаки и Functional Pearls на Русском, как оно вообще? Порекомендовали бы Русское издание?
Serghei
это помогло
Dmitry
есть такое дело - допустим, авторы какого-то пакета определили для своих типов тайпкласс FromJSON, и не определили ToJSON
допустим, мы хотим их типы где-то сохранять в JSON. Простое определение ToJSON приводит к тому, что
decode (encode x) == Nothing
Dmitry
вопрос - можно ли как-то дешево сделать свои инстансы FromJSON / ToJSON для этих библиотечных типов, что бы они нормально сериализовались?
Dmitry
не меняя сам код библиотеки
Alexander
newtype?
Denis
по хорошему инстанс должен быть в модули(и пакете, как следствие) с типами
Alexander
это дешевое и надёжное
Denis
newtype?
это к вопросу о том как сделать, чтобы не сломалось, если в пакет добавят ToJSON инстанс
Alexander
да никак, можно сделать какой-нить тест кейс на TH который вывалится если добавят
Alexander
а с newtype не сломается
Dmitry
этот тип содержит значения других типов, с которыми такая же история - для кого-то есть ToJSON, для кого-то нет
Alexander
ну безопасно только так
Alexander
небезопасно сделать свой Missing module
Alexander
и там все определить
Alexander
тогда весь код импортирующий Missing все сделает
Alexander
то, что спростое определение ToJSON приводит к Nothing говорит о том, что decoder ожидает не то, что дает encoder
Dmitry
ну так и есть
Alexander
т.е. нужно или newtype где определить совместимые или сделать ToJSON совпадающий с тем, что от тебя ждут
Dmitry
ну т.е у меня задача - тупо сериализовать "чужие" типы, лучше всего в json
Dmitry
какой JSON ждут - это вообще за гранью -тем более, что может поломаться
Dmitry
т.е задача ведь обобщается на всю сериализацию - сделаю свои инстансы Serialize, а они возьмут, и прикрутят их в следующей версии
Dmitry
получается, что в таких случаях надо всегда делать собственные типы-обёртки?
Dmitry
и использовать только их?
Alexander
да
Alexander
или только чужие
Dmitry
но при этом, есть такой пакет json, который умеет делать json представление для любого Generic
Dmitry
и я так понимаю, однозначным образом
A64m
Я думаю, что вполне можно делать и инстансы сироты в своих приложениях, общедоступные библиотеки с сиротами лучше, конечно, не делать
Denis
в своем коде с сиротам вопрос обычно только в том, как их грамотно реэкспортировать
Dmitry
ну тут даже не в этом проблема, а в том, что, скажем, в сторонней библиотеке есть FromJSON
Dmitry
но нет ToJSON
Dmitry
а когда делаешь свой, то надо или вручную генерить инстанс, что бы с ним работал "их" FromJSON . В общем, надо вероятно оборачивать своими типами и traverseBi перестраивать "их" дерево в своё
Dmitry
или еще как
A64m
если они TOJSON генерят TH из аэсона, то должно работать, если они его в ручную пишут, то можно посмотреть что они делают и вручную соотвествующий инстанс написать
Dmitry
ну а потом они в другой версии поменяют и привет
Dmitry
вручную генерят
Dmitry
но вопрос пожалуй более глобальный - нормально вообще сериализовать "чужие" типы?
A64m
да, но тут ничего не поделать, фактически они формат сериализации меняют
Dmitry
получается, что не очень, если только авторы сами не написали инстансы для своих типов
Dmitry
т.е в контракт модуля не входит сериализация/десериализация
Denis
если уж заморачиваться
Dmitry
ну, тут дешевле уже трансформировать типы в свои и уже их сохранять