elm - 为什么这个函数是这样注释的?
问题描述
我正在学习 Elm 并试图了解泛型函数的类型注释是如何编写的。(不确定“通用函数”在 Elm 中是否正确,请告知。)
给定以下代码:
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
type Msg = EmailChanged String | PasswordChanged String
formView label msg = div [] [text (label ++ ": "), input [onInput msg] []]
main = div [] [formView "Email" EmailChanged, formView "Password" PasswordChanged]
formView
像这样注释的函数背后的原因是什么
formView : String -> (String -> msg) -> Html msg
这个注释背后的原因是什么功能不正确?
formView : String -> msg -> Html Msg
解决方案
类型是递归“推断”的。你写了
formView label msg = div [] [text (label ++ ": "), input [onInput msg] []]
请注意msg
您传入的onInput
. onInput在标准库中定义为
onInput : (String -> msg) -> Attribute msg
所以你调用的参数msg
需要有 type String -> msg
。如果您的代码中没有其他内容与此相矛盾,那么您的代码将编译。如果 msg 的某些其他用途与该推论相矛盾,那么编译器将强制您协调差异。
在您的情况下,您传递给 formView EmailChanged
。您将其声明为使用字符串完成的自定义类型。在幕后,elm 创建了一个函数,该函数接受一个 String 并返回Msg
并调用它EmailChanged
,而您传入的正是后一个函数,它符合预期的类型。最后一点魔法需要一点时间来适应,但它在 Elm 中无处不在,所以你很快就会熟悉。
推荐阅读
- java - Spring JPA延迟加载@OneToOne实体不起作用
- dexie - DexieJS 如何从一个表中获取所有内容?
- python - 如何向 Matplotlib PolyCollection 添加图例?
- html - 如何使用 MVC 制作登录界面并使用 JWT 身份验证对其进行保护?
- javascript - 表单中的 Primeng 下拉菜单
- c++ - 我可以cout但不返回为什么?请提出更改建议
- sql - ON CONFLICT upsert 的两个冲突目标
- c++ - 有没有办法优化 c++ 字符串 += 运算符?
- regex - 如何设置正则表达式重复的上限
- linq - 当名称相同且 Id 与 linq 查询不同时如何获取第一个对象