首页 > 解决方案 > 为什么这个函数是这样注释的?

问题描述

我正在学习 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

标签: elm

解决方案


类型是递归“推断”的。你写了

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 中无处不在,所以你很快就会熟悉。


推荐阅读