считай что оператор (>>=) конструирует замыкание, которое когда будет запущенно сначала вызывает левую часть. Потом вызывает правую часть, которая просто возвратит новое замыкание. И дальше управление будет передано ему. Это и будет хвостовая рекурсия, поскольку возвращается тот же объект-замыкание
Мой тебе совет. Возьми ocaml или lisp и реализуй свой монаду. Эти вопросы исчезнуть. У меня монада была реализована как замыкание. Насколько я помню IO реализованна так же.
Переписал монады на схему, без подмешивание ленивости не получается сделать вечный цикл. Хорошо, не поленился добавил лени :-) Работает, хвала всевышнему.
теперь получается что то вроде (словами Хаскеля)
loop = delay (\world -> let (value, next_world) = (force (write 5)) world) in (force loop) next_world
Ну, это больше похоже на хвостовую рекурсию. Особенно в Haskell это выльется loop world = let .. in loop next_world. С IO разобрался, хорошо. Но неужели мне так со всеми монадами надо разбираться, чтобы понять? Должно же быть где то теоретическое обоснование! Какое то простое объяснение, следующее из закона монад или ещё что...
Reply
Возможен тут меморилик? Нет? Почему нет?
Reply
Reply
У меня монада была реализована как замыкание. Насколько я помню IO реализованна так же.
Reply
Reply
Хорошо, не поленился добавил лени :-) Работает, хвала всевышнему.
теперь получается что то вроде (словами Хаскеля)
loop = delay (\world ->
let (value, next_world) = (force (write 5)) world)
in (force loop) next_world
Ну, это больше похоже на хвостовую рекурсию. Особенно в Haskell это выльется loop world = let .. in loop next_world.
С IO разобрался, хорошо. Но неужели мне так со всеми монадами надо разбираться, чтобы понять? Должно же быть где то теоретическое обоснование! Какое то простое объяснение, следующее из закона монад или ещё что...
Reply
leak = do {a <- [1,2,3] ; leak }
Не проверял. Но думаю, 100% будет утечка.
Reply
leak !! 1000 замерает. На Сtrl-C не реагирует.
А вот код leak arg = do { a <- [1,2,3]; leak a }
как раз ведет себя как и ожидалось:
stack overflow на leak 1 !! 1000
Reply
Надо будет поглядеть насчёт списков внимательнее, а то я не пойму ни фига - с чего это leak без аргументов не течёт
Reply
Может deadlock какой случился с ghci? :)
Reply
это после инлайнинга. Это выражение тоже ничего не делает, когда запускаю leak !! 1000
Reply
Leave a comment