解释elm函数声明语法

时间:2017-08-15 11:56:14

标签: elm

我无法掌握以下功能声明&榆树语言的定义语法。

keyDown: (Int -> Msg) -> Attribute msg
keyDown event = 
  on "keydown" (Json.map event keyCode)

第一行是什么意思? keyDown: (Int -> Msg) -> Attribute msg。是否意味着,keyDown功能需要Int& Msg类型参数&返回类型Attribute

功能定义部分究竟发生了什么?

如何定义函数的参数?

1 个答案:

答案 0 :(得分:4)

TL; DR

keyDown函数接受另一个函数作为参数并返回一个属性,Elm的渲染器使用该属性来附加事件监听器。

如果您定义类型

type Msg
    = KeyDown Int

KeyDown充当Msg类型值的构造函数,所以我们可以说它的隐式类型是KeyDown: Int -> Msg,这就是你想要的从DOM事件中检索密钥代码。

解释

首先,我必须说正确的实现应该是这样的:

keyDown : (Int -> msg) -> Attribute msg
keyDown tagger =
    on "keydown" (Json.Decode.map tagger keyCode)

在签名中包含msg类型变量很重要,因此可以在应用程序的不同部分使用此事件侦听器,其中Html发出不同类型的{msg 1}}

要了解这里发生的事情,让我们仔细看看Html.Events.on

on : String -> Decoder msg -> Attribute msg

每个DOM事件都表示为具有某些字段的JavaScript对象。要从JavaScript检索数据,Elm需要通过Decoder传递它以确保运行时的类型安全,就像HTTP请求一样。

on中的解码器应该生成与属性本身相同类型的消息。

默认情况下,keyCode解码器会解码Int值,但我们想要的是发出一些消息。

Json.Decode.map帮助我们获取Int并应用一些产生消息的tagger函数。

解码器

整个(Json.map event keyCode)部分基本上是Decoder msg,它应用于事件对象以提取密钥代码和"标记"它留言。