エルムで私のモデルを取り、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
と呼ばれていない)への関数の名前を変更するには、問題を修正したが間違っているようです。これを行う正しい方法は何ですか?
私は行45を '|> List.map(\ coin - >(Basics.toString coin)++"¢ ")'に変更しました。 。ありがとうございました! –