Je lance Elm-repl pour jouer avec la langue.
J'aimerais voir quelle est l'heure actuelle. Comment je ferais ça? Cela ne semble pas être possible avec la bibliothèque actuelle. Pourquoi donc?
EDIT: J'ai fait un paquet pour aider avec ceci. http://package.Elm-lang.org/packages/z5h/time-app
Cela a été demandé autour d'Elm 0.15 - les choses sont différentes dans Elm 0.17 & 0.18 : see Comment obtenir l'heure actuelle dans Elm 0.17/0.18?
Pour résoudre ma propre question, j'ai créé une variante de StartApp qui inclut un horodatage pour chaque action.
La fonction de mise à jour a donc une signature:update : action -> Time -> model -> (model, Effects action)
The Gist is here. https://Gist.github.com/z5h/41ca436679591b6c3e51
Mise à jour pour 0.18 Ceci est redevenu plus simple. Maintenant, tout ce dont vous avez besoin est d’une commande et d’un message pour gérer le résultat.
type Msg
= OnTime Time
getTime : Cmd Msg
getTime =
Task.perform OnTime Time.now
Voir ceci Ellie
Réponse originale
Avec 0,17, cela est devenu beaucoup plus facile. Il y a maintenant une tâche dans la bibliothèque Time . Ainsi, par exemple, nous avons maintenant:
Time.now
|> Task.Perform NoOp CurrentTime
Vous pouvez utiliser le paquet Time et/ou le paquet Date .
Voici un exemple artificiel qui utilise les deux:
import Signal
import Time exposing (every, second)
import Date exposing (year, hour, minute, second, fromTime)
import Graphics.Element exposing (show)
main =
Signal.map currentTime (Time.every Time.second)
currentTime t =
let date' = fromTime t
hour' = toString (Date.hour date')
minute' = toString (Date.minute date')
second' = toString (Date.second date')
year' = toString (year date')
now = "The current time is: " ++ hour' ++ ":" ++ minute' ++ ":" ++ second'
in
show now
Si vous souhaitez que l’heure commence au début du programme, vous pouvez procéder comme suit:
Now.Elm
module Now where
import Native.Now
loadTime : Float
loadTime = Native.Now.loadTime
Native/Now.js
Elm.Native.Now = {};
Elm.Native.Now.make = function(localRuntime) {
localRuntime.Native = localRuntime.Native || {};
localRuntime.Native.Now = localRuntime.Native.Now || {};
if (localRuntime.Native.Now.values) {
return localRuntime.Native.Now.values;
}
var Result = Elm.Result.make(localRuntime);
return localRuntime.Native.Now.values = {
loadTime: (new window.Date).getTime()
};
};
votre code
programStart = Now.loadTime
Orme 0,19
Time.here
et Time.now
exemple https://ellie-app.com/3f6X2DW4cbma1Ci-dessous, je définis l'heure initiale comme heure unix, démarrer Time.millisToPosix 0
, mais vous pouvez le définir sur Nothing
et, plus tard, sur Just time
ou le transmettre avec Flag
.
module Main exposing (main)
import Browser
import Html exposing (Html)
import Task
import Time exposing (Posix)
main : Program () Model Msg
main =
Browser.element
{ init = \_ -> init
, view = view
, update = update
, subscriptions = \_ -> Sub.none
}
-- MODEL
type alias Model =
{ zone : Time.Zone
, now : Posix
}
init : ( Model, Cmd Msg )
init =
( Model Time.utc (Time.millisToPosix 0), Task.perform Zone Time.here )
-- UPDATE
type Msg
= Zone Time.Zone
| Now Posix
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
Zone zone ->
( { model | zone = zone }, Task.perform Now Time.now )
Now now ->
( { model | now = now }, Cmd.none )
-- VIEW
formatTime zone posix =
(String.padLeft 2 '0' <| String.fromInt <| Time.toHour zone posix)
++ ":"
++ (String.padLeft 2 '0' <| String.fromInt <| Time.toMinute zone posix)
++ ":"
++ (String.padLeft 2 '0' <| String.fromInt <| Time.toSecond zone posix)
view : Model -> Html Msg
view model =
Html.div []
[ Html.text <| formatTime model.zone model.now
]
Vous pouvez voir la réponse de pdoherty926 pour savoir comment faire quelque chose avec l'heure actuelle à Elm.
Elm-repl
n'a pas la capacité de travailler avec Signal
s, et le temps "change dans le temps", donc c'est un signal. Il n’existe pas non plus de Task
pour avoir le temps, à ma connaissance. Ni un moyen d'exécuter des tâches dans le repl, bien que je m'attende à ce que ce soit le cas dans le futur.
Je peux envisager de travailler avec le temps présent à Elm de deux manières principales:
Écrire/utiliser un module natif pour créer une fonction qui renvoie l’heure actuelle en ms (ou une tâche qui fera de même). Cette méthode n'est généralement pas recommandée. Je pense que # 2 est une meilleure approche. Mais un exemple de # 1 peut être trouvé ici: https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.Elm (voir la fonction getCurrentTime
)
Écrivez un programme utilisant l’architecture d’application Elm ( https://github.com/evancz/Elm-architecture-tutorial/ ), puis transmettez le signal de temps actuel comme entrée du cycle de mise à jour, en mettant à jour le modèle la nouvelle heure actuelle à chaque intervalle de votre choix. Ensuite, toutes vos autres méthodes peuvent simplement extraire l'heure actuelle de manière synchrone hors du modèle.
La réponse (pour 0,18) de Simon H m'a fait commencer dans la bonne direction, mais j'ai eu du mal à comprendre comment faire quelque chose avec ce moment . (user2167582
ajoute un commentaire à la réponse de Simon qui demande la même chose: comment obtenez-vous le temps mort? ').
Mon problème spécifique était que je voulais inclure l'heure actuelle dans le corps d'un POST sur le serveur.
J'ai finalement résolu le problème et je suis assez satisfait du résultat final. L'utilisation de Task.andThen
signifiait que, dans ma fonction postTime
, je pouvais simplement utiliser timestamp
comme paramètre 'régulier' à valeur float (ce qui est le cas lorsque la tâche est exécutée, I supposer).
Ma réponse complète SO est ici .
Voici la solution que j'ai trouvée et la voici dans Ellie :
module Main exposing (..)
import Html exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as JD
import Json.Encode as JE
import Task
import Time
type alias Model =
{ url : String
}
type Msg
= PostTimeToServer
| PostDone (Result Http.Error String)
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
PostTimeToServer ->
( model, postTimeToServer model.url )
PostDone _ ->
( model, Cmd.none )
view : Model -> Html Msg
view model =
div []
[ div []
[ button [ onClick PostTimeToServer ] [ Html.text "POST the current time." ]
]
]
postTimeToServer : String -> Cmd Msg
postTimeToServer url =
let
getTime =
Time.now
postTime t =
JD.string
|> Http.post url (JE.float t |> Http.jsonBody)
|> Http.toTask
request =
getTime <<-- Here is
|> Task.andThen postTime <<-- the key bit.
in
Task.attempt PostDone request
main =
Html.program
{ init = ( Model "url_here", Cmd.none )
, update = update
, view = view
, subscriptions = always Sub.none
}