2016-04-17 27 views
7

在榆樹什麼是採取我的模型和實現toString函數的正確方法?在榆樹什麼是實現我自己的正確方法toString

我正在尋找的類型將是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個模塊中的錯誤。 - TYPE MISMATCH --------------------------------------------- - CoinChanger.elm

toString的類型註釋與其定義不匹配。

42│的toString:型號 - >字符串 ^^^^^^^^^^^^^^^類型註釋說:

{ change : List Int } -> String 

但我推斷,該定義有此類型:

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

重命名功能toStr(或東西不叫toString)修復該問題,但似乎是錯誤的。什麼是正確的方法來做到這一點?

回答

6

的問題是,你調用函數toString,要覆蓋Basics模塊的toString功能,它使用的是在第45行

爲了避免這種情況,你需要導入Basics模塊並使用Basics.toString而不是簡單地toString來消除模糊性

+0

我將第45行更改爲'|> List.map(\ coin - >(Basics.toString coin)++「¢」)'並且所有工作都像您說的一樣工作。謝謝! –

相關問題