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

Mik*_*ris 7 elm

在Elm中,获取模型和实现toString函数的正确方法是什么?

我正在寻找的类型是toString : Model -> String,我能够使用类型的类似函数,toStr : Model -> String但我认为我希望调用该函数toString.

示例程序(Coin Changer kata):

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
            -> []
  }
Run Code Online (Sandbox Code Playgroud)

我认为这样做的正确方法是调用函数toString,但这会给编译器带来以下错误:

检测到1个模块中的错误. - 类型不匹配 - - - - - - - - - - - - - - - - - - - - - - - - CoinChanger.elm

类型注释toString与其定义不匹配.

42│toString:Model - > String ^^^^^^^^^^^^^^^类型注释说:

{ change : List Int } -> String
Run Code Online (Sandbox Code Playgroud)

但我推断定义有这种类型:

{ change : List { change : List Int } } -> String
Run Code Online (Sandbox Code Playgroud)

将函数重命名为toStr(或未调用的东西toString)可以解决问题,但似乎错了.这样做的正确方法是什么?

mar*_*osh 6

问题是,调用您的函数toString,您将覆盖您在第45行使用toStringBasics模块的功能.

为避免这种情况,您需要导入Basics模块并使用Basics.toString而不是简单toString地消除模糊性


wol*_*dex 5

对于编写 Elm 0.19+ 的人来说,接受的答案已经过时了。toString当前的解决方案是为要转换的类型编写自己的函数。在开发过程中可以使用它Debug.toString,但在代码中使用它会阻止生产环境的构建。