Durum bilgisi olan nesnelerin oluşturulması bir etki türüyle modellenmeli mi?
Zaten bir efekt sistemi kullanıyorsanız, büyük olasılıkla Ref
değiştirilebilir durumu güvenli bir şekilde kapsüllemek için bir türü vardır .
Ben de diyorum ki: durum bilgisi olan nesneleri modelleyinRef
. Bunların oluşturulması (ve bunlara erişim) zaten bir etki olduğundan, bu, hizmeti otomatik olarak da etkili hale getirecektir.
Bu, orijinal sorunuzun düzgün bir şekilde yan adımları.
Dahili değişken durumu düzenli olarak manuel olarak yönetmek var
istiyorsanız, bu duruma dokunan tüm işlemlerin sıkıcı ve hataya eğilimli etkiler olarak kabul edildiğinden (ve büyük olasılıkla iş parçacığı açısından güvenli hale getirildiğinden) emin olmalısınız. Bu yapılabilir ve @ atl'ın cevabına katılıyorum, durumsal nesnenin yaratılmasını kesinlikle etkilemeniz gerekmediği (referans bütünlüğünün kaybı ile yaşayabildiğiniz sürece), ama neden kendinizi beladan kurtarmayın ve kucaklamayın Etki sisteminizin araçları tüm yol boyunca?
Tüm bunların saf ve deterministik olduğunu düşünüyorum. Ortaya çıkan örnek her seferinde farklı olduğu için referans olarak saydam değildir. Bir efekt türü kullanmak için iyi bir zaman mı?
Sorunuz şu şekilde yeniden ifade edilebilirse:
Ek faydalar ("zayıf tip sınıfı" kullanarak doğru çalışan bir uygulamanın üstünde) ve durum için de bir etki türü (halihazırda devlet erişimi ve mutasyonu için kullanılmalıdır) kullanılmasını haklı gösterecek kadar yeterli mi? yaratma?
sonra: Evet, kesinlikle .
Bunun neden faydalı olduğuna dair bir örnek vermek için:
Hizmet yaratma bir etki yaratmasa da aşağıdakiler işe yarar:
val service = makeService(name)
for {
_ <- service.doX()
_ <- service.doY()
} yield Ack.Done
Ancak bunu aşağıdaki gibi yeniden düzenlerseniz, derleme zamanı hatası almayacaksınız, ancak davranışı değiştirmiş olacaksınız ve büyük olasılıkla bir hata eklediniz. makeService
Etkili olduğunu beyan etmiş olsaydınız, yeniden düzenleme işlemi tür denetlemez ve derleyici tarafından reddedilmezdi.
for {
_ <- makeService(name).doX()
_ <- makeService(name).doY()
} yield Ack.Done
Yöntemin adlandırılmasını makeService
(ve bir parametreyle de), yöntemin ne yaptığını ve yeniden düzenleme işleminin yapmak için güvenli bir şey olmadığını, ancak "yerel akıl yürütme" isimlendirme kuralları ve makeService
bunu anlamak için: Mekanizmayı mekanik olarak karıştırılamayan (tekilleştirilmemiş, tembel hale getirilmiş, istekli, ölü kod kaldırılmış, paralelleştirilmiş, gecikmeli, önbelleğe alınmış, önbellekten temizlenmiş vb.) yani "saf" değildir) etkili olarak yazılmalıdır.
delay
ve bir F [Hizmet] döndürmelidir . Örnek olarak, IO'dakistart
yönteme bakın , düz fiber yerine bir IO [Fiber [IO,?]] Döndürür.