elm 0.19.1 中 4 位数的当前年份

Amp*_*aro 2 date elm

如何使用 ELM 0.19.1 执行一个函数来获取 4 位数字的当前年份?我读过一些东西,但在 0.19.1 上没有任何效果。

签名:

getCurrentYear : Int
Run Code Online (Sandbox Code Playgroud)

执行:

getCurrentYear => 2020
Run Code Online (Sandbox Code Playgroud)

编辑:

也许执行new Date().getFullYear()javascript代码?

bdu*_*kes 7

最简单的方法是在启动应用程序时通过标志传递年份,因为当前年份在应用程序运行过程中不太可能改变。在这种情况下,您可以使用您建议的 JavaScript 片段(ellie 示例):

    Elm.Main.init({ 
      node: document.querySelector('main'), 
      flags: {
        year: new Date().getFullYear(),
      } 
    });
Run Code Online (Sandbox Code Playgroud)
module Main exposing (main)

import Browser
import Html exposing (Html, p, text)


type alias Flags =
    { year : Int }


main : Program Flags Model Msg
main =
    Browser.element
        { init = \flags -> ( Model flags.year, Cmd.none )
        , view = view
        , update = update
        , subscriptions = \_ -> Sub.none
        }


type alias Model =
    { year : Int }


type Msg
    = NoOp


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        NoOp ->
            ( model, Cmd.none )


view : Model -> Html Msg
view model =
    p [] [ text "The year is ", text (String.fromInt model.year) ]
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Time.now请求当前时间,正如Robin Zigmond 的回答所暗示的那样,但这是指向 Elm 0.18 文档(用于elm-lang/core而不是elm/time)。对于 0.19,您需要 aTime.Posix和 aTime.Zone才能调用Time.toYear. 您可以链接Time.now(aTask产生Posix值)和Time.here(aTask产生Zone具有当前时区偏移量的a)以在 one 中检索这些值Cmd。这是一个例子(也在 ellie 上

module Main exposing (main)

import Browser
import Html exposing (Html, p, text)
import Task exposing (Task)
import Time


type alias Flags =
    { year : Int }


main : Program () Model Msg
main =
    Browser.element
        { init = \() -> ( Model 0, whatYearIsIt |> Task.perform GotYear )
        , view = view
        , update = update
        , subscriptions = \_ -> Sub.none
        }


whatYearIsIt : Task x Int
whatYearIsIt =
    Task.map2 Time.toYear Time.here Time.now


type alias Model =
    { year : Int }


type Msg
    = GotYear Int


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        GotYear year ->
            ( { model | year = year }, Cmd.none )


view : Model -> Html Msg
view model =
    p [] [ text "The year is ", text (String.fromInt model.year) ]
Run Code Online (Sandbox Code Playgroud)


Rob*_*ond 6

正如我在评论中已经说过的,在 Elm 中定义一个返回当前年份的函数是不可能的。您必须从 Elm 运行时系统(基本上是 JavaScript,但您不必自己编写)获取此类信息。这通过命令发生,您可以在其中告诉运行时系统为您做一些事情。但请注意,您不能简单地检索该命令的“返回值”并将其返回到您的 Elm 代码中。相反,您必须将其传递给一个可以将其转换为“消息”的函数(请参阅此处的基本 Elm 架构教程,在您可以使用 Elm 执行任何操作之前,了解这一点很重要)- 这样您就可以将值存储在您的建模,从而在您的应用程序中显示它。

这些模式确实需要一些理解,特别是如果你不习惯纯函数式编程——但是一旦你习惯了它,好处是巨大的,包括几乎保证没有运行时错误,以及大大增强的推理能力你的代码。

为了具体获取年份,看起来您需要这个库,它为您提供 (as now) aTask而不是Cmd. 您可以使用Task.perform将其转换为命令,该命令记录在此处- 事实上,它甚至提供了一个与您的用例非常匹配的示例 - 我将在此处复制它以供后代使用:

import Time  -- elm install elm/time
import Task

type Msg
  = Click
  | Search String
  | NewTime Time.Posix

getNewTime : Cmd Msg
getNewTime =
  Task.perform NewTime Time.now
Run Code Online (Sandbox Code Playgroud)

您必须填写它以适合您自己的用例,尤其是您自己的Msg类型。但它给出了一个很好的基本轮廓。要获取用户的当前年份,您需要将Time.Posix类型替换为Int,并将Time.now命令替换为(Task.map2 Time.toYear Time.here Time.now),正如@bdukes 在他的回答中所解释的那样。