2016-04-17 17 views
7

W Elmie, jaki jest właściwy sposób na wzięcie mojego Modelu i zaimplementowanie funkcji toString?W Elmie, jaki jest prawidłowy sposób implementacji własnego narzędzia doStringa

Typ, którego szukam, to toString : Model -> String, jestem w stanie wykonać podobną funkcję z typem toStr : Model -> String, ale myślę, że chciałbym, aby funkcja nazywała się toString.

Przykładowy program (Coin Changer 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 
      -> [] 
    } 

Myślę poprawny sposób to zrobić byłoby, aby wywołać funkcję toString, ale to daje mi następujący błąd z kompilatora:

Wykryte błędy w 1 module. - NIEPOWODZENIE TYPU --------------------------------------------- - CoinChanger.elm

Adnotacja typu dla toString nie pasuje do jej definicji.

42│ toString: Model -> String ^^^^^^^^^^^^^^^ typ adnotacji mówi:

{ change : List Int } -> String 

Ale ja wywodząc, że definicja ta ma Typ:

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

Zmiana nazwy funkcji toStr (lub coś nie nazwie toString) rozwiązuje ten problem, ale wydaje się błędne. Jaki jest prawidłowy sposób to zrobić?

Odpowiedz

6

Problem polega na tym, nazywając swoją funkcję toString, jesteś przesłanianie funkcji toString modułu Basics, których używasz na linii 45.

Aby tego uniknąć, będziesz musiał importować moduł Basics i używać Basics.toString zamiast po prostu toString do eliminare dwuznaczności

+0

zmieniłem linię 45 do '|> List.map (\ moneta -> (moneta Basics.toString) ++ "¢")' i wszystko działało tak jak mówiłeś . Dziękuję Ci! –