2015-06-27 14 views
5

Reader monadını kullanmayı öğrenmem gerekiyor. (Ve ayrıca Yazar ve Devlet).Bu sıra tabanlı oyunda Reader monadını kullanmak doğru mu?

Oyun-yarışmaları her zaman Oyun boyunca geçerli olan global parametrelerden oluşur. Ve sadece bir Dönüş sırasında geçerli olan bir grup parametre.

Tüm en son yarışmaların hemen hemen hepsinin Game and Turn giriş parametreleri olarak sahip olduğu çok sayıda ve birçok işlevle sona erdim.

data Game = Game AllNeeded StrategicPositions AndGameRelatedStuffs 
data Turn = Turn PlayersPositions AndTurnDependentStuffs 

ve ben bağımlı verileri açmak aldığımız her döngü için ben bir Reader Game Turn değişken olması için plan: okuyucu monad hakkında okuduktan sonra

, yaşadığım hakkında düşünüyorum

turnReader = Reader currentGame currentTurn 
let actionToPerform = play turnReader 

Sizce Reader monadının iyi bir örneği mi? Gözünüzün kör olmasını ve gitmesini ve bu bağlamda Reader monadını kullanmayı öğrenmem gerektiğini düşünüyor musunuz? Yoksa bunun için Devlet gibi daha uygun bir monad var mı?

+2

Bu, (a) Okuyucu monadının çok kesin semantiklere sahip olduğu ve (b) asıl sorunun unvanla karşılaştırıldığında sınırlı bir kapsamı olduğu varsayımı gibi değildir. Daha net olması için başlığı düzenleyeceğim. – AndrewC

cevap

4

Reader Monad, hesaplamada okumak istediğiniz değişmez durumunuz olduğunda kullanılır. Temel olarak tüm monadik eylemlere dolaylı olarak aktarılan ekstra bir argümana sahip olmak gibi.

Oyunda göründüğü gibi aslında değiştirmek bir şey (yani dönüş veya oyun durumu). Bu durumda State monad ile çalışmak daha kolay olabilir. Modifiye devlet ile yeni monadic hesaplama, devlete bağlı tüm eylemler grubuna sahip Reader kullanmak dışında sonra monad içinde monad onları idam durumunu değiştirme ve çalıştırmak için

vs. Bu hantal geliyor .

Reader'u kullanmak aslında State'u kullanmaya benzer. Basitçe: put işlem (ve türevleri) izin verilmez. Yani, Reader kullanarak yazmaya başlayabilirsiniz ve bir yerle karşılaşırsanız, muhtemelen State'u kullanmanın daha iyi olacağını bildiğiniz durumu değiştirmek isterdiniz. Veya viceversa: State'u kullanarak başlayın ve eğer durumunuzu hiçbir zaman değiştirmezseniz, Reader ile değiştirin.

4

Her dönüşte Turn değer değiştiğini varsayarak ve Game yapmıyorsa, gibi bir şeye sahip olmak mantıklı görünmektedir. Bunun için monad transformatörlerini okumalısın (ben şahsen "Monad Transformers Step by Step" (PDF) gibi).

İlgili konular