2016-04-17 7 views
7

In Elm, was ist die richtige Methode, um mein Modell zu nehmen und eine toString-Funktion zu implementieren?In Elm, was ist der richtige Weg, um meine eigene toString zu implementieren

Der Typ ich suche wäre toString : Model -> String, ich bin in der Lage eine ähnliche Funktion mit der Art der toStr : Model -> String zu machen, aber ich würde denken, ich die Funktion aufgerufen toString werden mag.

Beispielprogramm (der Münzwechsler 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 
      -> [] 
    } 

Ich würde denken, die richtige Art und Weise, dies zu tun wäre die Funktion aufzurufen toString, aber das gibt mir die folgende Fehlermeldung vom Compiler:

Erkannte Fehler in 1 Modul. - TYPE MISMATCH --------------------------------------------- - CoinChanger.elm

Der Typ Annotation für toString stimmt nicht mit seiner Definition überein.

42│ toString: Modell -> String ^^^^^^^^^^^^^^^ Die Typanmerkung sagt:

{ change : List Int } -> String 

Aber ich bin Folgern, dass die Definition dieses hat Typ:

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

Umbenennung der Funktion toStr (oder etwas nicht toString genannt) behebt das Problem aber scheint falsch. Was ist der richtige Weg, dies zu tun?

Antwort

6

Das Problem ist, dass, ruft Ihre Funktion toString, Sie überschreiben die toString Funktion des Basics-Modul, das Sie in Zeile verwenden 45.

Um dies zu vermeiden, werden Sie das Basics Modul importieren müssen und benutze Basics.toString anstelle von einfach toString um die Mehrdeutigkeit zu eliminieren

+0

Ich änderte Zeile 45 zu '|> List.map (\ Münze -> (Basics.toString Münze) ++" ¢ ")' und alles funktionierte genau wie du gesagt hast . Vielen Dank! –

Verwandte Themen