2016-04-17 20 views
7

Elm'de Modelimi almanın ve toString işlevini uygulamanın doğru yolu nedir?Elm'de kendi toString'i uygulamak için doğru yol nedir?

Aradığım tür, toString : Model -> String olabilir, toStr : Model -> String türüyle benzer bir işlev yapıyorum ancak bu işlevin toString çağrılmasını isterim.

Örnek programı (Para Değiştirici kata):

module CoinChanger where 

import Html exposing (..) 
import StartApp.Simple as StartApp 
import Signal exposing (Address) 
import Html.Attributes exposing (..) 
import Html.Events exposing (on, targetValue) 
import String 


---- MAIN ---- 


main = 
    StartApp.start 
    { 
     model = emptyModel 
     ,update = update 
     ,view = view 
    } 


---- Model ---- 


type alias Model = 
    { 
     change : List Int 
    } 


emptyModel : Model 
emptyModel = 
    { 
     change = [] 
    } 


---- VIEW ---- 


toStr : Model -> String 
toStr model = 
    model.change 
    |> List.map (\coin -> (toString coin) ++ "¢") 
    |> String.join ", " 


view : Address String -> Model -> Html 
view address model = 
    div [] 
    [ 
     input 
     [ 
      placeholder "amount to make change for" 
     , on "input" targetValue (Signal.message address) 
     , autofocus True 
     -- style 
     ] 
     [] 
    , div [] 
     [ 
      text (toStr model) 
     ] 
    ] 


---- UPDATE ---- 


changeFor : Int -> List Int 
changeFor amount = 
    [ 25, 10, 5, 1 ] 
    |> List.foldl 
    (\coin (change, amount) 
     -> (change ++ List.repeat (amount // coin) coin 
     , amount % coin) 
    ) 
    ([], amount) 
    |> fst 



update : String -> Model -> Model 
update change model = 
    { model | change = 
     case String.toInt change of 
     Ok amount 
      -> changeFor amount 

     Err msg 
      -> [] 
    } 

ben işlevi toString çağırmak olacaktır Bunu yapmak için doğru bir yol düşünürdüm, ama bu derleyici bana aşağıdaki hatayı veriyor:

1 modülde tespit edilen hatalar. - TİP MISMATCH --------------------------------------------- - CoinChanger.elm

toString için ek açıklama, tanımıyla eşleşmiyor.

42│ toString: -:

{ change : List Int } -> String 

Ama tanım bu olduğunu çıkarım am Model> Dize ^^^^^^^^^^^^^^^ tipi açıklama söylüyor türü:

{ change : List { change : List Int } } -> String 

toStr (ya da bir şey toString aramadı) fonksiyonu yeniden adlandırma sorunu giderir ama yanlış görünüyor. Bunu yapmanın doğru yolu nedir?

cevap

6

sorun işlevini toString çağırarak, bunu önlemek için hat 45.

kullanmakta olduğumuz Basics modülün toString fonksiyonunu geçersiz, sen Basics modülü almak gerekir, yani ve toString yerine Basics.toString yerine

+0

'u ortadan kaldırmak için hat 45'i değiştirdim. |> Liste.map (\ coin -> (Basics.toString coin) ++ "¢") 've her şey tıpkı söylediğin gibi çalıştı . Teşekkür ederim! –

İlgili konular