2016-04-17 7 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モジュールでエラーが検出されました。 - タイプミスマッチ--------------------------------------------- - CoinChanger.elm

toStringの型名はその定義と一致しません。

42│のtoString: - :

{ change : List Int } -> String 

しかし、私は定義がこれを持っていることを推測していますモデル>文字列 ^^^^^^^^^^^^^^^型注釈が言っていますタイプ:

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

toStr(か何かtoStringと呼ばれていない)への関数の名前を変更するには、問題を修正したが間違っているようです。これを行う正しい方法は何ですか?

答えて

6

問題はあなたの関数toStringを呼び出して、あなたはこれを避けるために線45

で使用しているBasicsモジュールのtoString関数をオーバーライドしている、あなたはBasicsモジュールをインポートする必要があります、ということですBasics.toStringの代わりに単にtoStringを使用してください。

+0

私は行45を '|> List.map(\ coin - >(Basics.toString coin)++"¢ ")'に変更しました。 。ありがとうございました! –

関連する問題