LINUX.ORG.RU

История изменений

Исправление 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)