Ilya
Reader(T) требует знание структуры, чтобы он был "сверху" на стеке
пока не очень понятно:( а есть какой-нибудь пример, когда нельзя воспользоваться ReaderT?
Alexander
ExceptT (ReaderT IO)
кана
зачем нужны классы MonadReader, MonadState и т.д.?
смотри, ты в стеке StateT s (Reader e) a ты можешь сделать get/put потому что верхний уровень - State но сделать x <- ask ты не можешь, ведь Reader где-то внутри (а ask требует Reader наверху), нужно делать x <- StateT (\s -> (ask, s)) (или x <- lift ask)
кана
а MonadReader выносит ask в класс и говорит, что для Reader ask = ask, а для StateT Reader ask = lift ask таким образом для WriterT (StateT (Reader)) ask = lift (lift ask)
Alexander
правда использовать mtl для автоподстройки лифтов не круто
Ilya
а MonadReader выносит ask в класс и говорит, что для Reader ask = ask, а для StateT Reader ask = lift ask таким образом для WriterT (StateT (Reader)) ask = lift (lift ask)
ага, примерно понятно, спасибо. Значит вся соль в (готовых) инстансах вроде MonadReader r m => MonadReader r (StateT s m) или MonadReader r m => MonadReader r (ExceptT e m).
кана
да
Hermann
can i do questions about erlang?
Alexander
это не основной кейс
Alexander
can i do questions about erlang?
But it may be better to ask on erlang channel as answers will be Haskell biased
Hermann
exist group of erlang?
Зигохистоморфный
А как False к Ordering приведётся?
Думаю что можно как-то через GT, LT и прочее (у меня просто свой sortByM через рекурсивные схемы)
Alexander
в условиях когда у тебя GT не транзитивен это затруднительно
Зигохистоморфный
Alexander
к решению через булеан претензий нет :)
Alexander
хотя как нет, если у тебя 2^n ответов, а ожидается n!
Hermann
thanks, I'm making a simple example, everything from the terminal. I want to make a sum of a list and use two actors: an actor calculates the sum and sends the result and another actor reads it: Pippo = spawn (math1 listaddfun, []). Pippo! {sommapf, self (), [1,2,3]}. receive N-> N. I do not understand why if I send other msg as Pippo! {sommapf, self (), [1,2,3,5]} the receive command becomes blocker
Alexander
exist group of erlang?
search for erlang in group list and you'll find few groups. I have no idea about its quality though
кана
по сути своей bang-pattern это просто <- do-ноации как expression, поэтому f (<- x) мб и нормальный синтаксис
Alexander
с чего бы вдруг ?
кана
легко вообразить, что x <- y это просто let x = <- y как это сделано в меинстримных языках, что делает синтаксис более единообразны таким образом вместо трех do-"стейтментов" z = do x <- a y <- b f x y мы используем два <- как выражения: z = f (<- x) (<- y) это я и имел в виду, когда сказал, что bang это по сути <- из do как выражение
Alexander
а при чем здесь !
Alexander
?
Alexander
или это идрисовый ! ?
кана
ну такой синтаскис более известен как bang-паттерн, так как он уже реализован в идрисе так: f !x !y
Alexander
просто в haskell bang pattern имеет своё хорошо известное значение
кана
окей, хорошо что теперь понятно про что речь
Alexander
с этим всем нужно смотреть нетривиальные примеры, тут то все что угодно подойдет
Alexander
в вот` f (<- g (<-x) <-y) (p (<- t))`
Alexander
там уже можно байкшеддить из-за синтаксиса
Alexander
тут важный вопрос в последовательносити извлечения
Alexander
ну так про это вся война и была
Alexander
чтобы семантика вынесения и выполнения адекватной была
Alexander
я тогда просто сформулировал проблему для тупых :)
кана
в идрисе четко задан порядок выполнения - сначала самые глубокие и левые
кана
это сложно работает с ленивостью полагаю
кана
поэтому нужно разграничивать выполнение эффекта и вычисления значения после выполнения эффекта эффекты вычисляем из глубины слева направо, значения вычисляются лениво как обычно, никаких проблем на самом деле я не очень понимаю из-за чего там проблемы, даже прочитав, нужно еще раз прочитать обсуждение
A64m
по сути своей bang-pattern это просто <- do-ноации как expression, поэтому f (<- x) мб и нормальный синтаксис
он логичный, с этим я спорить не буду, проблема в том что вербозный
A64m
ну такой синтаскис более известен как bang-паттерн, так как он уже реализован в идрисе так: f !x !y
только это не паттерны же, так что банг-нотация, не банг-паттерн
кана
да, моя ошибка, вот из-за хаскельного бэнг-паттерна и пишу неверно
Alexander
ну вот у меня монада StateT, у меня есть функция inc, хочу ее свободно использовать. Мне нужно не только чтобы порядок задавался однозначно, но и чтобы это происходило очевидным образом
кана
речь про x <- !inc + !inc какой? не вижу проблем
Alexander
на синтетике их вообще сложно увидеть
Alexander
вот в реальной задаче скорее всего езще на code review скажут переписать в 3 строки
Alexander
в итоге получим просто очередную алттернативу <$>
A64m
ну если человек видел какой-нибудь императивный язык, то последовательность ему будет понятна
Alexander
++i + ++i в разных имератвиных языках дает разный ответ, кстати
Alexander
хотя к монадам применим только один из вариантов, разумеется
Alexander
проблема в том, что пример тоже тривиальный, можно написать liftM2 (+) inc inc
кана
ого, а что за liftMN? Чем отличается от liftAN?
Alexander
возможно, именно как универсальный инструмент эта штука и будет хороша, но чего то приниципиально нового она не даст
кана
легаси от Monad not Applicative?
Alexander
ого, а что за liftMN? Чем отличается от liftAN?
если я не ошибаюсь, даже в стандартной либе есть монады, для которых a <|> b /= a » b
Alexander
я перепутал альтернейтив и аппликатив
Alexander
не суть важно
A64m
я, кстати, думаю, что может и !-нотация вербозная слишком, в DDC вон вообще выводится все
A64m
> I am still using mainly GHC before 7.10 because of the insecurity introduced by Foldable on tuples in GHC-7.10.
Combot
combot.org/chat/-1001043143583
Антон
Поясните, пожалуйста, откуда IO () берётся? А то я что-то не понимаю: genericHead f e = \case (x:_) -> f x [] -> e headPrelude = genericHead id (error "Prelude.head: empty list") main = let emp = ([] :: [Int]) in do handle print $ headPrelude emp Не компилируется с Couldn't match type ‘Int’ with ‘IO ()’ Expected type: [IO ()] Actual type: [Int] In the first argument of ‘headPrelude’, namely ‘emp’ In the second argument of ‘($)’, namely ‘headPrelude emp’
Alexander
Правлю я такой сигнатуры моего мультипарамного АДТ, заменяю хак-тип Exists на GADTs, еще пару рефакторингов делаю, и думаю, что эти пять экранов ошибок с несовпадающими сигнатурами придется всю ночь править. Но вдруг, когда я заменяю последнюю переменную типа, все компилится и снова работает. Вот за это мы и ❤ Haskell
тот
https://www.twitch.tv/puffnfresh стрим хаскел
Антон
:t handle
flip catch handle :: Exception e => (e -> IO a) -> IO a -> IO a
Alexander
https://www.twitch.tv/puffnfresh стрим хаскел
Это новая фишка передовых разработчиков - стримить Haskell?
Alexander
flip catch handle :: Exception e => (e -> IO a) -> IO a -> IO a
это ответило на твой вопрос?
Alexander
откуда IO
Alexander
у меня была идея стримить, че-нить типа решения hackerrank и т.п
Alexander
популярность языка растет думаю
Слабоватое свидетельство. Ну стримят ведущие хаскеллисты, ну и что ж. Кто не стримит-то всякую фигню?
Alexander
* Кто не стримит-то, в том числе, всякую фигню?