Haskell STM осколок TVAR

Я новичок в Haskell и STM и пытаюсь понять основную концепцию.

В Haskell и функциональном программировании в целом, поправьте меня, если я ошибаюсь, нет такого понятия, как назначение.

Я не могу писать x=3; все, что я могу сделать, это создать другую привязку с x а также 3,

Теперь, когда речь идет о TVar и потоках, если у меня есть несколько потоков, совместно использующих один и тот же TVar, если один поток изменяет значение, с writeTVar, другой поток увидит измененное значение, я прав?

Так что, если у меня есть 2 потока, разделяющие то же самое TVar Int var, а первый добавляет 1 к нему, в случае успеха второй поток увидит обновленное значение?

Thaks

2 ответа

Решение

Может быть, лучше рассмотреть TVar не переменная, а канал, с которого вы можете читать и писать.

Чистую переменную можно считать чистой функцией, которая всегда возвращает какое-то значение (и это значение связывается только один раз, как в вашем примере). Переменная / функция в монаде имеет некоторый "контекст" (для этого и нужны монады), который может изменить свое значение (например, randomIO :: Random a => IO a от System.Random может считаться "монадическим значением", значением, которое может быть изменено при любом вызове).

Чтение и запись в TVar явные операции, которые не являются чистыми, поэтому функции readTVar/writeTVar завернуты в STM Монада, они зависят от некоторого скрытого контекста, который может изменить результат (делая возможной передачу значения между потоками). Это ограничивает эти операции в STM хотя монада, которая может быть экранирована IO только.

Да, TVar это контейнер, который не изменяется при изменении его содержимого. Все потоки видят один и тот же контейнер, и когда один поток изменяет то, что было сохранено в контейнере, когда другой поток просматривает, он находит измененное значение.

Другие вопросы по тегам