Как я уже сказал в своем комментарии, в Elm невозможно определить функцию, которая возвращает текущий год. Вы должны получить такую информацию из системы времени исполнения Elm (которая в основном JavaScript, но вам не нужно писать ее самостоятельно). Это происходит с помощью команд , где вы говорите системе времени выполнения что-то для вас. Но обратите внимание, что вы не можете просто получить «возвращаемое значение» этой команды и вернуть его в свой код Elm. Вместо этого вы должны передать его в функцию, которая может преобразовать его в «сообщение» (см. Базовое руководство по архитектуре Elm здесь , это важно понять, прежде чем вы сможете что-либо делать с Elm) - это затем позволяет вам сохранить значение в вашей модели и, таким образом, отобразить его в вашем приложении.
Эти шаблоны требуют некоторого осознания, особенно если вы не привыкли к чисто функциональному программированию - но как только вы получите Привыкли к этому, преимущества огромны, в том числе почти гарантированное отсутствие ошибок времени выполнения и значительно улучшенная способность рассуждать о вашем коде.
Для того, чтобы получить конкретный год, похоже, вам нужна эта библиотека , который дает вам (как now
) Task
, а не 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
Вам нужно будет заполнить это, чтобы соответствовать вашему собственному варианту использования, в частности вашему типу Msg
. Но это дает хороший базовый план c. Чтобы узнать текущий год пользователя, вам нужно заменить тип Time.Posix
на Int
, а команду Time.now
на (Task.map2 Time.toYear Time.here Time.now)
, как объяснил @bdukes в своем ответе.