gpt4 book ai didi

elm - 扩展 Elm 教程表单应用程序以包含编号的输入年龄

转载 作者:行者123 更新时间:2023-12-04 14:41:11 25 4
gpt4 key购买 nike

我一直在关注本教程:http://guide.elm-lang.org/architecture/user_input/forms.html

那里的文字对我来说很有意义,我的问题与它在页面底部列出的练习有关。它要求我:

"Add an additional field for age and check that it is a number."



我对此有困难,因为 onInput函数似乎只接受一个字符串输入。我觉得奇怪的是 type="number" 没有等价物输入。

尽管如此,这是我的尝试不起作用:

import Html exposing (..)
import Html.App as Html
import Html.Attributes exposing (..)
import Html.Events exposing (onInput)
import String exposing (length)

main =
Html.beginnerProgram { model = model, view = view, update = update }


-- MODEL

type alias Model =
{ name : String
, password : String
, passwordAgain : String
, age : Int
}


model : Model
model =
Model "" "" "" 0


-- UPDATE

type Msg
= Name String
| Password String
| PasswordAgain String
| Age Int

update : Msg -> Model -> Model
update msg model =
case msg of
Name name ->
{ model | name = name }

Password password ->
{ model | password = password }

PasswordAgain password ->
{ model | passwordAgain = password }

Age age ->
{ model | age = age }


-- VIEW

view : Model -> Html Msg
view model =
div []
[ input [ type' "text", placeholder "Name", onInput Name ] []
, input [ type' "password", placeholder "Password", onInput Password ] []
, input [ type' "password", placeholder "Re-enter Password", onInput PasswordAgain ] []
, input [ type' "number", placeholder "Age", onInput Age ] []
, viewValidation model
]

viewValidation : Model -> Html msg
viewValidation model =
let
(color, message) =
if model.password /= model.passwordAgain then
("red", "Passwords do not match!")
else if length model.password <= 8 then
("red", "Password must be more than 8 characters!")
else
("green", "OK")
in
div [ style [("color", color)] ] [ text message ]

我得到的错误如下:
-- TYPE MISMATCH ----------------------------------------------------- forms.elm

The argument to function `onInput` is causing a mismatch.

58| onInput Age
^^^
Function `onInput` is expecting the argument to be:

String -> a

But it is:

Int -> Msg

注意:我知道我可以将 Age 输入创建为另一个文本输入,但该练习特别要求我检查它是否为“数字类型”。我认为这意味着我应该将它作为 Int 保存在模型中。

我很清楚错误是什么。我只是想知道在 Elm 中解决这个问题的惯用方法。谢谢。

最佳答案

来自 onInput 的任何用户输入事件是一个字符串。

您的 Model预计它是 Int
使用 String.toInt从字符串值解析整数值。

调整 update函数将类型转换为 Int并将类型签名更改为 Age String

Age age ->
case String.toInt age of
Ok val ->
{ model | age = val }

-- Notify the user, or simply ignore the value
Err err ->
model

这样您就可以选择将错误通知给用户。

如果 Maybe value 更适合你,整个语句可以简化为:
Age age ->
{ model | age = Result.toMaybe (String.toInt age) }

关于elm - 扩展 Elm 教程表单应用程序以包含编号的输入年龄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com