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
это контейнер, который не изменяется при изменении его содержимого. Все потоки видят один и тот же контейнер, и когда один поток изменяет то, что было сохранено в контейнере, когда другой поток просматривает, он находит измененное значение.