Nano Hash - криптовалюты, майнинг, программирование

Как использовать поля в Elm 0.13

Я пытался заставить поля работать, но продолжаю терпеть неудачу. Я также пытался найти примеры, но единственные примеры, которые я смог найти, — это использование Elm 0.14, в котором используется новый Channel API, которого нет в Elm 0.13.

Поэтому я начал с примера, предложенного в каталоге< /а>

import Graphics.Input.Field (..)
import Graphics.Input (..)

name : Input Content
name = input noContent

nameField : Signal Element
nameField = field defaultStyle name.handle identity "Name" <~ name.signal

И для того, чтобы использовать поле, которое я пытался

main : Signal Element
main = Signal.lift2 display Window.dimensions gameState

display : (Int,Int) -> GameState -> Element
display (w,h) g =
    container w h middle <|
        collage gameWidth gameHeight
            (if  | g.state == Menu ->
                    [ rect gameWidth gameHeight
                        |> filled black
                    , toForm nameField
                    , plainText "*The name entered in the nameField*"
                    ]
                | otherwise -> []
            )

Но я продолжаю получать следующую ошибку

Expected Type: Signal.Signal Graphics.Element.Element
Actual Type: Graphics.Element.Element

Почему элемент больше не является сигналом... В определении функции ясно сказано, что он должен выводить сигнал, верно? Теперь, как я смогу ввести имя, которое затем смогу использовать внутри переменной?


Ответы:


1

В Elm 0.13 было несколько раздражающих запутанных сообщений об ошибках типов. Ожидаемое/Фактическое обычно меняются местами. В этом случае проблема возникает из-за использования nameField : Signal Element в display : (Int,Int) -> GameState -> Element. display — это чистая (не сигнальная) функция, но, чтобы быть чистой, вы не можете использовать сигнал где-либо внутри. Чтобы решить эту проблему, поднимите сигнал nameField на уровень выше, до main. Чтобы использовать то, что введено в поле, используйте входной сигнал:

main : Signal Element
main = Signal.lift4 display Window.dimensions gameState name.signal

nameField : Content -> Element
nameField = field defaultStyle name.handle identity "Name"

display : (Int,Int) -> GameState -> Content -> Element
display (w,h) g currentContent =
    container w h middle <|
        collage gameWidth gameHeight
            (if  | g.state == Menu ->
                    [ rect gameWidth gameHeight
                        |> filled black
                    , toForm (nameField currentContent) -- use something other than `currentContent` here to influence the field content. 
                    , plainText currentContent.string
                    ]
                | otherwise -> []
            )
21.12.2014
  • Так что, если я хочу распространить это поведение на меню для игры? Из вашего ответа я понял, что я должен посылать все сигналы, независимо от того, актуальны они в данный момент или нет, в качестве дополнительных входных данных для display. Затем они будут игнорироваться, когда меню не отображается, и станут актуальными, когда меню всплывет. Это имеет большой смысл. Теперь меня беспокоит только то, как я смогу отправить информацию обратно в поля? Как я могу отправить текущее значение обратно? 23.12.2014
  • Я не совсем понимаю, что вы имеете в виду. Вы хотите повлиять на информацию, отображаемую в полях? Я отредактирую код, чтобы сделать его более заметным, где вы можете влиять на поле. 23.12.2014
  • Например. У меня есть игрок, у которого есть имя. Таким образом, name будет полем типа Player. Когда открывается меню, оно зачитывает имя игрока за пределами поля и заполняет его на поле. Теперь пользователь может изменить имя в поле, если он захочет играть под другим именем, и поле будет обновлено с новым именем. 23.12.2014
  • Если у игрока жестко закодировано начальное имя, вы можете указать в поле ввода: name = input { noContent | string <- "InitialName"}. В противном случае он должен быть частью вашего GameState, и вы можете использовать стандартные конструкции if или case для разделения возможных состояний в функции display и использовать что-то другое, кроме currentContent. 23.12.2014
  • Кажется, это работает! Итак, я узнал, что name.signal можно использовать в части ввода, а name.handle можно использовать в части отображения системы, чтобы обе части взаимодействовали друг с другом. Теперь обобщим это поведение на несколько полей и кнопок, но это не должно быть слишком сложно (надеюсь ^^). Все равно еще раз спасибо! 23.12.2014
  • После попытки заставить это работать в моем коде, я все еще не понимаю, для чего нужен обработчик. Если я правильно понял, то все изменения, которые происходят при вводе чего-либо, будут проходить через name.signal, и я могу обновить свой GameState в соответствии с ним. Если затем я хочу снова отобразить меню, я могу обновить поле, используя последний параметр Content. Все это работает, но это заставило меня задуматься о том, что делает этот параметр name.handle? Я могу изменить его с помощью дескриптора другого ввода, и он все еще работает, как и раньше, ничего не меняется. Так что дает? 23.12.2014
  • Дескриптор сообщает полю, куда отправлять пользовательский ввод. Если вы измените дескриптор на другой Input во время выполнения программы, изменения, внесенные кем-то, должны быть отправлены этому другому Input. Если вы видите другое поведение, это может быть ошибкой. 23.12.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..