Alexander
Выскажу не самое популярное мнение, но мне сильно не нравится hpack. Как по мне, он даёт не так много преимуществ, но поддержка со стороны тулинга и дружелюбность экосистемы уменьшается. А точнее по пунктам: 1. Многим нравится поле общих зависимостей (и не только) в hpack, но в cabal-2.2. это уже впилено, и там можно указать в общей станзе любой кусок станзы. 2. Автоматический поиск модуля: добавить модуль — одна строка. Это не так часто происходит, чтобы было слишком неудобно. К тому же, когда есть модули, которые генерируются пакетами вроде proto-lens, то их всё равно надо добавлять в package.yaml явно, без этого не работает, поэтому проблема всё равно полностью не решается. 3. YAML. Я сам лично не люблю этот формат, мне в нём много не нравится. Например, там были проблемы с парсингом версий, когда они у пакетов похожи на число. В одном multi-package проекте мы использовали hpack, и там дублицирование кода уменьшилось благодаря алиасам в yaml. Но полностью дублирование убрать не удалось, потому что yaml не поддерживает конкатенацию списков. Поэтому общие куски зависимостей между пакетами всё равно нельзя вынести в отдельный файл :( Если уж хочется полноценную и программируемую конфигурацию, тогда лучше использовать dhall. 4. Генерация .cabal файла с новым хешом каждый раз. Если над проектом работает несколько людей, то у них постоянно будут конфликты в этом .cabal файле, если он есть на GitHub. А если его нет на GitHub, то людям, у которых не стоит hpack, будет трудней сбилдить проект, надо прилагать больше усилий, чтобы этот cabal файл сгенерить. Да, stack работает, но вокруг одного stack мир не вертится. То есть как по мне, преимущества довольно сомнительные, но есть недостатки, создаётся раскол в сообществе, ухудшается и без того не самый хороший тулинг. Уж лучше все силы, что были потрачены на создание hpack ушли бы в cabal — добавить в exposed-modules какое-нибудь поле типа automatic, и весь hpack был бы не нужен.
не убедительно 6)
Alexander
врочем не важно
Alexander
я примерно тоже самое писал
Alexander
в общем у hpack нету ни одного значимого плюса, при очевидных минусах
Alexander
разве что формат кабала все ещё нигде не специфицирован в виде машиночитаемого документа
Alexander
впрочем к yaml я схемы тоже не видел
Anonymous
@mitutee будет жить. Поприветствуем!
Sergei
Интересует тема реверсивных парсеров, было ди что-то свежее за последние пару лет?
Sergei
Там где комбинаторы строят парсер и принтер одновременно.
Dmitrii
Там где комбинаторы строят парсер и принтер одновременно.
Мы в Kowainik как раз работаем над библиотекой tomland, которая является двусторонним конвертером для формата TOML (парсер и принтер одновременно): * https://github.com/kowainik/tomland Реализация основана на идее Monadic Profunctors (не мы придумали, идея не новая). Пример использования можно посмотреть тут: * https://github.com/kowainik/tomland/blob/master/examples/Playground.hs Буквально на этих выходных я впилил поддержку суммы типов на основе чего-то среднего между изоморфизмов и призм. Окончательный дизайн не до коцаа устаканен, поэтому туториалов пока нет, и документация может быть не самой хорошей. Но мы эту библиотеку используем в продакшене в нескольких проектах уже. А сама идея описана в этом блог посте: * https://blog.poisson.chat/posts/2017-01-01-monadic-profunctors.html
Sergei
Удачно я попал, спасибо, изучу!
Alexander
lift2 = lift . lift -- Есть do elem:elems <- lift2 get lift2 $ put elems return elem -- Хочу что то вроде lift2 $ state $ head &&& tail -- Но в первом варианте за счет MonadPlus паттерн-матчинг -- давал mempty для [], а тут очевидно exception Есть какие то способы написать код в стиле второго варианта?
кана
lift2 не нужен, потому что он уже полиморфен
кана
lift
кана
он уже поднимается до нужной монады в стеке
Alexander
неа
Alexander
у меня transformers если что
кана
http://hackage.haskell.org/package/transformers-0.5.5.0/docs/Control-Monad-Trans-Class.html
кана
полиморфный lift он как раз из transformers
Alexander
может я инстансы не подгрузил?
Alexander
тип посмотри
Alexander
import Control.Monad.Trans.Class
Alexander
lift :: Monad m => m a -> t m a
Alexander
он с предыдущего уровня на следующий поднимает
Alexander
lift :: (MonadTrans t, Monad m) => m a -> t m a
Alexander
ну мне надо на два уровня поднятся
Alexander
lift2 нужно, все верно
кана
хм, окей, это верно тогда
кана
но тогда хз зачем такие ограничения на трансформерс, когда есть полимфорный в mtl
Alexander
получше работает
Alexander
иногда
Alexander
и специализируется почти всегда
Alexander
и можно много уровней одного типа иметь
Alexander
в общем использование tf можно понять
Alexander
про ответ на вопрос пока думаю
Alexander
много уровней одного типа это как раз важно, так как я newtype не делаю
Alexander
может конечно надо делать
Alexander
т.к. с mtl начинаются извращения типа mtl-classes, ether, layers которые в разной степени не работают
Alexander
а с mtl я смогу делать полиморфный state, кстати?
кана
ну то есть тут точно не будет ошибки?
Alexander
там матчинг во внешней монаде
Alexander
видимо с разумный fail
Alexander
там стэк MaybeT ReaderT StateT
кана
а ок
Alexander
в случай 2 матчинг внутри State
Alexander
даже внутри чистого, т.к. там state
Alexander
я бы просто использовал uncons
Alexander
+ какую-то ещё магию делающую ответ разумным
Alexander
просто тебе хочется фишек разных уровней
Alexander
сделал lift2 get >>= (guard . not . null) >> lift2 (state $ head &&& tail) в итоге
Alexander
эффекты такое обещают
Alexander
но не знаю сделают ли
Alexander
магии чет много выходит
Alexander
чтобы из maybe сделать maybeT
Alexander
остановлюсь на варианте с гвардом наверно
Alexander
если чувствуешь что много магии - пишешь самый тупой бойлерплейт
Alexander
или может быть какую то стрелку чтобы state и get не смешивать, но имхо это ожидаемое
Alexander
ну тупой это с do-нотацией
Alexander
пьешь чай возвращаешься и смотришь нет ли очевидных упрощений
кана
import Control.Monad.State import Control.Monad.Trans.Maybe uncons :: [a] -> Maybe (a, [a]) uncons (x:xs) = Just (x, xs) uncons [] = Nothing tryState :: (MonadPlus m, MonadState s m) => (s -> Maybe (a, s)) -> m a tryState f = do Just (result, state') <- gets f put state' pure result program :: MaybeT (State [Int]) Int program = tryState uncons main :: IO () main = do print $ flip runState [1, 2, 3] $ runMaybeT program print $ flip runState [] $ runMaybeT program ну общего решения не вижу
кана
какой кстати нейминг можете посоветовать для таких функций?
Alexander
вроде общепринятого нету
кана
почему в lens у view ограничение на Lens' a a?
кана
я давно увидел, но все забыл спрашивать, но в своей реализации делает спокойно: view :: Optic (->) (K a) s t a b -> (s -> a) view lens = getK . lens K а вот в lens это иногда мешало
кана
что я упускаю? Сделано это для более крутых линз?
Artem
Все доброго времени суток. Хочу узнать про фреймворки под GHCJS и прочие полезности. Кто каким опытом может поделится?
Anonymous
легко могу ошибаться, но где-то читал, что вот эта самая рабочая либа: https://hackage.haskell.org/package/fay а, интересует именно GHCjs?
Anonymous
я бы так смело не стал утверждать
читал. Не мой мотороллер 😯
Зигохистоморфный
ну и miso
кана
да фиг его знает, мне уже кажется я что-то путаю
кана
но как с liftIO, который из любого MonadIO работает
Kirill
Все доброго времени суток. Хочу узнать про фреймворки под GHCJS и прочие полезности. Кто каким опытом может поделится?
а он ещё окончательно не сдох? Теоретически reflex самый внятный был, ещё miso был, на прошлом fpconf даж доклад был
Kirill
ой, блин, уже такое написано