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 для автоподстройки лифтов не круто
кана
да
Hermann
can i do questions about erlang?
Dmitry
Alexander
Alexander
это не основной кейс
Alexander
Hermann
exist group of erlang?
Alexander
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
A64m
кана
да, моя ошибка, вот из-за хаскельного бэнг-паттерна и пишу неверно
A64m
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?
A64m
кана
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.
Leonid 🦇
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 стрим хаскел
Alexander
Антон
Антон
:t handle
flip catch
handle :: Exception e => (e -> IO a) -> IO a -> IO a
Alexander
Alexander
откуда IO
тот
Alexander
у меня была идея стримить, че-нить типа решения hackerrank и т.п
Alexander
* Кто не стримит-то, в том числе, всякую фигню?