История изменений
Исправление quasimoto, (текущая версия) :
Я про
(inner)
(context1)
прилетают они туда исключительно за ширмой по dynamic scoping. Scheme, CL (не считая специальных переменных) и все остальные нормальные языки используют лексическую область видимости, так что вообще не вижу смысла обсуждать заведомо сломанное поведение.
А так классический пример:
f >- g = uncurry g . f
ret = (,)
put x _ = ((), x)
get x = (x, x)
lift f x y = x >- \a -> y >- (ret . f a)
t =
put 1 >- \_ ->
let l x = lift (+) get (ret x) in
l 1 >- \r1 ->
put 2 >- \_ ->
l 1 >- \r2 ->
ret (r1, r2)
-- > t 0
-- ((2,3),2)
Исправление quasimoto, :
Я про
(inner)
(context1)
прилетают они туда исключительно за ширмой по dynamic scoping. Scheme, CL (не считая define и специальных переменных) и все остальные нормальные языки используют лексическую область видимости, так что вообще не вижу смысла обсуждать заведомо сломанное поведение.
А так классический пример:
f >- g = uncurry g . f
ret = (,)
put x _ = ((), x)
get x = (x, x)
lift f x y = x >- \a -> y >- (ret . f a)
t =
put 1 >- \_ ->
let l x = lift (+) get (ret x) in
l 1 >- \r1 ->
put 2 >- \_ ->
l 1 >- \r2 ->
ret (r1, r2)
-- > t 0
-- ((2,3),2)
Исходная версия quasimoto, :
Я про
(inner)
(context1)
прилетают они туда исключительно за ширмой по dynamic scoping. Scheme, CL (не считая специальных переменных) и все остальные нормальные языки используют лексическую область видимости, так что вообще не вижу смысла обсуждать заведомо сломанное поведение.
А так классический пример:
f >- g = uncurry g . f
ret = (,)
put x _ = ((), x)
get x = (x, x)
lift f x y = x >- \a -> y >- (ret . f a)
t =
put 1 >- \_ ->
let l x = lift (+) get (ret x) in
l 1 >- \r1 ->
put 2 >- \_ ->
l 1 >- \r2 ->
ret (r1, r2)
-- > t 0
-- ((2,3),2)