将Time.now转换为Date - Elm

时间:2017-02-02 12:03:45

标签: functional-programming elm

您好我是Elm的新手,我在获取当前时间并将其转换为Elm中的约会时遇到了一些困难。

我有一个消息类型 -​​ 消息和一个向模型添加新消息的功能。我正在尝试将消息发布的时间与文本和用户ID一起存储。

但是我一直收到这个错误 -

The argument to function `fromTime` is causing a mismatch.

59|              Date.fromTime (currentTime Time.now)
                            ^^^^^^^^^^^^^^^^^^^^
Function `fromTime` is expecting the argument to be:

Time

But it is:

x -> Time -> Time

Hint: It looks like a function needs 2 more arguments.

这是代码

type alias Message =
    { text : String,
      date : Date,
      userId : Int
    }

currentTime : task -> x -> Time -> Time
currentTime _ _ time =
    time

newMessage : String -> Int -> Message
newMessage message id =
    { text = message
    , date = Date.fromTime (currentTime Time.now)
    , userId = id
    }

我真的无法弄清楚发生了什么。任何帮助将非常感激。感谢。

1 个答案:

答案 0 :(得分:3)

Elm是一种纯语言,函数调用是确定性的。请求当前时间稍微复杂一些,因为我们可以调用的函数不会根据一天中的不同时间返回给我们。具有相同输入的函数调用将始终返回相同的内容。

获取当前时间是在副作用的土地上。我们必须要求架构以纯粹的方式给我们时间。 Elm处理的方式是通过TaskProgram功能。您可以通过Task功能中的Cmd向{1}}发送update。然后,Elm Architecture在幕后制作自己的东西以获取当前时间,然后它通过另一次调用update函数以纯代码响应。

以下是您可以在documentation粘贴的简单示例,您可以点击按钮查看转换为Date的当前时间。

import Html exposing (..)
import Html.Events exposing (onClick)
import Time exposing (..)
import Date
import Task

main =
    Html.program
        { init = { message = "Click the button to see the time" } ! []
        , view = view
        , update = update
        , subscriptions = \_ -> Sub.none
        }

type alias Model = { message: String }

view model =
  div []
    [ button [ onClick FetchTime ] [ text "Fetch the current time" ]
    , div [] [ text model.message ]
    ]


type Msg
    = FetchTime
    | Now Time


update msg model =
  case msg of
    FetchTime ->
      model ! [ Task.perform Now Time.now ]

    Now t ->
      { model | message = "The date is now " ++ (toString (Date.fromTime t)) } ! []

如果你熟悉javascript,那么Now消息的目的可以被宽泛地认为是一个回调函数,它提供的参数是Elm Architecture发送的时间。