在Elm中,获取模型和实现toString函数的正确方法是什么?
我正在寻找的类型是toString : Model -> String
,我可以使用toStr : Model -> String
的类型创建类似的函数,但我认为我希望调用该函数{{1} }。
示例程序(Coin Changer kata):
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
-> []
}
,但这会给编译器带来以下错误:
在1个模块中检测到错误。 - 类型不匹配 - - - - - - - - - - - - - - - - - - - - - - - - CoinChanger.elm
toString
的类型注释与其定义不匹配。42│toString:Model - >串 ^^^^^^^^^^^^^^^类型注释说:
toString
但我推断定义有这种类型:
{ change : List Int } -> String
将函数重命名为{ change : List { change : List Int } } -> String
(或者不称为toStr
的东西)可以解决问题,但似乎错了。这样做的正确方法是什么?
答案 0 :(得分:6)
问题在于,调用您的函数toString
,您将覆盖您在第45行使用的toString
模块的Basics
函数。
为避免这种情况,您需要导入Basics
模块并使用Basics.toString
而不是简单地toString
来消除歧义
答案 1 :(得分:2)
对于编写 Elm 0.19+ 的任何人来说,公认的答案已经过时了。当前的解决方案是为要转换的类型编写自己的 const results = function () {
let result = [];
for (let i = 0; i < Teams.length; i++) {
result.push(`${Teams[i].Team} have ${Teams[i].wins} wins- with ${
Teams[i].draw
} draws and ${Teams[i].lost} loses. The total anount of points are: ${
Teams[i].wins * 3 + (Teams[i].lost = 0) + Teams[i].draw * 1
}`);
}
return result;
};
console.log(results());
函数。有一个 toString
可在开发期间使用,但在您的代码中使用它会阻止为生产而构建。