Refs для состояния, которое должно быть синхронизировано между потоками. Если вам нужно отслеживать кучу разных вещей, и вам иногда нужно будет выполнять операции, которые записывают сразу несколько вещей, используйте refs. Каждый раз, когда у вас есть несколько разных частей состояния, использование ссылок не является плохой идеей.
Атомы для независимого состояния, которое должно быть синхронизировано между потоками. Если вам никогда не понадобится изменять состояние атома и все остальное одновременно, использование at Atom безопасно (в частности, если во всей программе имеется только один фрагмент состояния, вы можете поместить его в атом) , В качестве нетривиального примера, если вы пытаетесь кэшировать возвращаемые значения функции (то есть запомните его), использование атома, вероятно, безопасно - состояние невидимо для всего, что находится за пределами функции, поэтому вам не нужно беспокоиться об изменении состояния внутри функции что-нибудь испортило.
Первичная точка агентов заключается в том, что они работают в другом потоке. Вы можете получить значение агента и указать ему применить функцию к его значению, но вы не знаете, когда функция будет запущена или к какому значению будет применена функция.
Вары предназначены для случаев, когда вам нужно что-то хранить для каждого потока. Если у вас многопоточная программа, и каждый поток нуждается в собственном частном состоянии, поместите это состояние в переменную.
Что касается примеров из реального мира, если вы предоставите пример того, что вы пытаетесь сделать, мы можем сказать вам, что использовать.