您好我是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
}
我真的无法弄清楚发生了什么。任何帮助将非常感激。感谢。
答案 0 :(得分:3)
Elm是一种纯语言,函数调用是确定性的。请求当前时间稍微复杂一些,因为我们可以调用的函数不会根据一天中的不同时间返回给我们。具有相同输入的函数调用将始终返回相同的内容。
获取当前时间是在副作用的土地上。我们必须要求架构以纯粹的方式给我们时间。 Elm处理的方式是通过Task
和Program
功能。您可以通过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发送的时间。