在Elm中,实现自己的toString的正确方法是什么

时间:2016-04-17 16:50:54

标签: elm

在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的东西)可以解决问题,但似乎错了。这样做的正确方法是什么?

2 个答案:

答案 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 可在开发期间使用,但在您的代码中使用它会阻止为生产而构建。