2017-02-02 3 views
1

Привет, я совершенно новый для Вязов, и у меня возникают трудности с получением текущего времени и преобразованием его в дату в Вяз.Convert Time.now to Date - Elm

У меня есть тип сообщения - сообщение и функция, чтобы добавить новое сообщение в модель. Я пытаюсь сохранить время публикации сообщения вместе с текстом и идентификатором пользователя.

Однако я получаю эту ошибку -

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 
    } 

Я действительно не могу понять, что происходит. Любая помощь приветствуется. Благодарю.

ответ

3

Elm - чистый язык, где вызовы функций детерминированы. Запросить текущее время немного сложнее, потому что нет функции, которую мы можем назвать, которая вернет нам другое время в зависимости от времени суток. Функциональные вызовы с одним и тем же входом всегда возвращают одно и то же.

Получение текущего времени лежит в стране побочных эффектов. Мы должны попросить архитектуру дать нам время таким чистым способом. То, как Elm имеет дело с этим, - это функции Task и Program. Вы отправляете Task в Elm Architecture через Cmd в свою update функцию. Архитектура Elm затем делает свою собственную вещь за кулисами, чтобы получить текущее время, затем она отвечает чистым кодом другим вызовом вашей функции update.

Вот простой пример, который вы можете вставить на http://elm-lang.org/try, где вы нажимаете кнопку, чтобы увидеть текущее время, преобразованное в 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 сообщения может быть свободно рассматривать как функцию обратного вызова, где аргумент предоставляет это время, передаваемого по Эой архитектуры.

+0

Хорошее объяснение! Большое спасибо. –