2015-10-20 15 views
6

İşte çalışmak için kullanılan kod (umarım uygun şekilde kısaltılır)Reaktif Muz 1.0.0 - Bu eski kod neden kırılıyor?

makeNetworkDescription :: forall t . Frameworks t => Parameters -> Moment t() 
makeNetworkDescription params = do 
    eInput <- fromAddHandler (input params) 
    eTick <- fromAddHandler (tick params) 
    .. 
let 
    bResourceMap :: Behavior t ResourceMap 
    bResourceMap = accumB initRmap $ 
     adjustMarket <$> 
     bMarketRolls <@ 
     eTick 

var Ama şimdi tipleri değişti.
elimizde:
makeNetworkDescription :: Parameters -> MomentIO() ve accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)

Biraz accumB tanımından kapalı

bResourceMap :: Behavior ResourceMap 
bResourceMap = accumB initRmap $ 
       adjustMarket <$> 
       bMarketRolls <@ 
       eTick 

için bResourceMap tanımını değiştirmek demek, ancak neler olacak görelim.

ghc çünkü davranış MonadMoment kapsamında olması gerekir accumB türünden bağımsız olarak, bir hatayı

Couldn't match type ‘Behavior ResourceMap’ with ‘ResourceMap’ 
Expected type: Behavior ResourceMap 
    Actual type: Behavior (Behavior ResourceMap) 

Right verir. MonadMoment bir göz olması iki örneğini

instance MonadMoment Moment where liftMoment = id 
instance MonadMoment MomentIO where liftMoment = MIO . unM 

Behavior (Behavior ResourceMap) fiili tip azmini neden yaptığını Yani, dış tip uymayan bir MonadMoment, olmak zorunda

bulabilirsiniz.

Bu tür sorunların nasıl çözüleceği konusunda tavsiyede bulunmak istiyorum, tüm Behavior tanımlarımda gerçekleşir.

+0

sadece meraklı: bu bir gerçek mi yoksa hobi mi? –

+0

Gerçek, ama bir oyun oyunu değil. Sadece bir oyun olmaktan başka bir amaca hizmet eden bir oyun. –

cevap

5

bResourceMap tanımlamak için bir let ifadeden çok Birli bağlama kullanan tek almalı accumB yeni tip sığacak şekilde kodunu ayarlama:

bResourceMap <- accumB initRmap (adjustMarket <$> bMarketRolls <@ eTick) 

Eğer alıntı türü hatası ilgisiz görünüyor. Tahminim, initRmap'un ResourceMap olmasından yanlışlıkla Behavior ResourceMap türüne dönüşerek, yanlış eşleşmeye yol açacaktı.

+0

Bunu denedim ancak diğer bağlamalar kapsam dışında kalıyor. Bunu önlemek için RecursiveDo eklemem gerektiğini düşünüyorum. –

+1

@MichaelLitchard Gerçekten de - değişiklikler, 'acummB'/'step' ile tanımlanan davranışları içeren karşılıklı özyinelemeli tanımlamalar için 'MonadFix'/'RecursiveDo '' ya ihtiyaç duyacağınız anlamına gelir. – duplode

+0

Gelecekteki haskellers için - anahtar yapmak yerine mdo kullanmaktır. Rec ve fix için syntactic şeker. –