LINUX.ORG.RU

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

Исправление quasimoto, (текущая версия) :

For example, in an imperative programming setting, a := b + c would mean that a is being assigned the result of b + c in the instant the expression is evaluated. Later, the values of b and c can be changed with no effect on the value of a.

In reactive programming, the value of a would be automatically updated based on the new values.

Что-то я не пойму всей глубины концепции. Функция a() = b + c при вызове a() будет меняться значениями вместе с b и c. Ну и ссылочной прозрачности нет никакой.

А если так

data Formula t = Formula t :+ Formula t | Cell (Ref t)

eval :: Num t => Formula t -> IO t
eval (Cell r) = get r
eval (x :+ y) = liftM2 (+) (eval x) (eval y)

b, c :: Ref Int
b <- ref 1
c <- ref 2

a :: Ref Int -> Formula Int
a x = Cell x :+ Cell b :+ Cell c

{-
> x <- ref 3
> let f = a x
> eval f
6
> x =: 4
> c =: 5
> b =: 6
> eval f
15
-}

то b и c это чистые адреса ссылок, a — чистая функция из адреса ссылки в формулу (которая просто ADT с такими адресами). А вот run . eval уже не ссылочно прозрачная.

Исходная версия quasimoto, :

For example, in an imperative programming setting, a := b + c would mean that a is being assigned the result of b + c in the instant the expression is evaluated. Later, the values of b and c can be changed with no effect on the value of a.

In reactive programming, the value of a would be automatically updated based on the new values.

Что-то я не пойму всей глубины концепции. Функция a() = b + c при вызове a() будет меняться значениями вместе с b и c. Ну и ссылочной прозрачности нет никакой.

А если так

data Formula t = Formula t :+ Formula t | Cell (IORef t)

eval :: Num t => Formula t -> IO t
eval (Cell r) = get r
eval (x :+ y) = liftM2 (+) (eval x) (eval y)

b, c :: Ref Int
b <- ref 1
c <- ref 2

a :: Ref Int -> Formula Int
a x = Cell x :+ Cell b :+ Cell c

{-
> x <- ref 3
> let f = a x
> eval f
6
> x =: 4
> c =: 5
> b =: 6
> eval f
15
-}

то b и c это чистые адреса ссылок, a — чистая функция из адреса ссылки в формулу (которая просто ADT с такими адресами). А вот run . eval уже не ссылочно прозрачная.