2017-03-09 31 views
5

Modelin ilk kez güncellenmesi için basit bir uygulamayı elm-lang tutorial'dan değiştirmeye çalışıyorum, ardından başka bir güncellemeyi tetikliyorum.Elm - Msmd'yi Msd'ye dönüştürün Msn

The 3rd branch has this type: 

({ gifUrl : String, topic : String }, Cmd Msg) 

But the 4th is: 

({ gifUrl : String, topic : String }, Msg) 

Yani benim Msg tipi Cmd Msg olması gerekiyor: newtopic şube çünkü

update msg model = 
    case msg of 
    MorePlease -> 
     (model, getRandomGif model.topic) 

    NewGif (Ok newUrl) -> 
     ({ model | gifUrl = newUrl }, Cmd.none) 

    NewGif (Err _) -> 
     (model, Cmd.none) 

    -- my addition 
    NewTopic newTopic -> 
     ({ model | topic = newTopic}, MorePlease) 

Bu derleyici başarısız olur. Bir Cmd Msg içine "Benim Msg açabilirsiniz Nasıl

not:? Ben bu değişikliği yapmak için daha basit bir yolu yoktur tanımak ama Elm anlamaya çalışıyorum daha temelden

cevap

13

hayır gerçekten yoktur bir Cmd Msg içine Msg çevirmek gerekir update sadece bir fonksiyonu olduğunu unutmayın, bu yüzden yinelemeli diyebilirsiniz

sizin NewTopic vaka işleyicisi buna basitleştirilmiş olabilir

:..

NewTopic newTopic -> 
    update MorePlease { model | topic = newTopic} 

Gerçekten gerçekten bu senaryo için Cmd ateşlemesi Elm Architecture isteseydi, size Cmd.none basit map yapabileceğini senin Msg istenen:

(aslında önerilmez)
NewTopic newTopic -> 
    ({ model | topic = newTopic}, Cmd.map (always MorePlease) Cmd.none) 

+0

Teşekkür ederim. Bu sorunu çözmek için daha kolay bir yoldur. Hala merak ediyorum, bir "Msg" bir "Cmd Msg" için "dökmek" gerekecek mi? Ve ben yaparsam nasıl olur? – steel

+0

Cevabımı bir örnekle güncelledim –

+0

@ChadGilbert: Yeni "Msg" yi kullanarak neden ikinci yaklaşımı önermeyeceğinizi biraz daha açıklayabilir misiniz? – DanEEStar