2016-04-17 11 views
7

को लागू करने का सही तरीका क्या है मेरे मॉडल को लेने और एक टूस्ट्रिंग फ़ंक्शन को लागू करने का सही तरीका क्या है?एल्म में अपने स्वयं के टूस्ट्रिंग

मैं जिस प्रकार की तलाश कर रहा हूं वह toString : Model -> String होगा, मैं toStr : Model -> String के प्रकार के साथ एक समान कार्य करने में सक्षम हूं लेकिन मुझे लगता है कि मैं चाहता हूं कि फ़ंक्शन को toString कहा जाए।

उदाहरण कार्यक्रम (सिक्का परिवर्तक काता):

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 
      -> [] 
    } 

मैं यह करने के समारोह toString कॉल करने के लिए किया जाएगा सही तरीका लगता है, लेकिन है कि मुझे संकलक से निम्न त्रुटि देता है:

1 मॉड्यूल में त्रुटियों की पहचान की गई। - प्रकार मिस्मैच --------------------------------------------- - CoinChanger.elm

toString के लिए प्रकार एनोटेशन इसकी परिभाषा से मेल नहीं खाता है।

42│ toString: मॉडल -> स्ट्रिंग ^^^^^^^^^^^^^^^ प्रकार एनोटेशन कह रहा है:

{ change : List Int } -> String 

लेकिन मैं परिभाषा यह है कि निष्कर्ष निकालते हूँ प्रकार:

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

toStr (या कुछ और toString नहीं बुलाया) करने के लिए समारोह का नाम बदलने पर समस्या ठीक होती है लेकिन गलत लगता है। ऐसा करने का सही तरीका क्या है?

उत्तर

6
समस्या

कि, अपने कार्य toString बुला, आप Basics मॉड्यूल के toString समारोह है, जो आप लाइन 45

पर प्रयोग कर रहे हैं इससे बचने के लिए अधिभावी रहे हैं, आप Basics मॉड्यूल आयात करना होगा है और अस्पष्टता

+0

को हटाने के लिए का उपयोग करें, मैंने लाइन 45 को '|> List.map (\ coin -> (Basics.toString coin) ++ "¢") बदल दिया है और सब कुछ आपके जैसा काम करता है । धन्यवाद! –

संबंधित मुद्दे