elm 中的“<<”运算符是什么意思?

2024-03-31

以下代码取自榆树形式示例 http://elm-lang.org/edit/examples/Intermediate/Form.elm,第 122 行,什么是<<运算符的意思是?

Field.field Field.defaultStyle (Signal.send updateChan << toUpdate) "" content

找不到它Elm 语法参考 http://elm-lang.org/learn/Syntax.elm.

这是否意味着,当字段发生变化时,而不是发送它的content to updateChan, send toUpdate to updateChan?


<< http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Basics#%3C%3C是一个函数组合运算符,在核心库中定义Basics http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Basics。 Basics 中的所有功能均不合格地导入到 Elm 项目中。

Elm 的类型系统

让我们回顾一下 Elm 类型系统的基础知识。

Elm is 静态类型 http://elm-lang.org/guide/model-the-problem#contracts。这意味着在 Elm 中每个变量或函数都有一个类型,并且这个类型永远不会改变。 Elm 中的类型示例有:

  • Int
  • String
  • Maybe Bool
  • { name : String, age : Int }
  • Int -> Int
  • Int -> String -> Maybe Char.

静态类型意味着编译器确保所有函数和变量的类型在编译期间都是正确的,因此不会出现运行时类型错误。换句话说,你永远不会有类型的函数String -> String接收或返回Int,允许这样做的代码甚至无法编译。

您还可以通过替换具体类型来使函数具有多态性,例如String or Maybe Int带有类型变量,它是任意小写字符串,例如a。许多 Elm 核心函数都是类型多态的,例如List.isEmpty http://package.elm-lang.org/packages/elm-lang/core/2.1.0/List#isEmpty有类型List a -> Bool。这需要一个List某种类型并返回类型的值Bool.

如果您再次看到相同类型的变量,则该类型变量的实例必须是相同类型的。例如List.reverse http://package.elm-lang.org/packages/elm-lang/core/2.1.0/List#reverse有类型List a -> List a。所以如果你申请List.reverse到一个整数列表(即具有类型的东西List Int), it will返回一个整数列表。这样的函数不可能接受整数列表,但返回字符串列表。这是由编译器保证的。

Elm 中的所有函数都是curried https://stackoverflow.com/a/36321/596361默认情况下。这意味着,如果您有一个包含 2 个参数的函数,它将转换为一个包含 1 个参数的函数,并返回一个包含 1 个参数的函数。这就是为什么 Elm 的函数应用语法与其他语言(如 Java、C++、C#、Python 等)中的函数应用如此不同。没有理由编写someFunction(arg1, arg2),当你可以写someFunction arg1 arg2。为什么?因为现实中someFunction arg1 arg2实际上是((someFunction arg1) arg2).

柯里化使得部分应用 https://stackoverflow.com/q/218025/596361可能的。假设您想部分申请List.member http://package.elm-lang.org/packages/elm-lang/core/2.1.0/List#member. List.member有一个类型a -> List a -> Bool。我们可以将类型读作“List.member接受 2 个参数,类型为a并输入List a”。但我们也可以将类型读作“List.member接受 1 个类型参数a。它返回一个类型的函数List a -> Bool”。因此我们可以创建一个函数isOneMemberOf = List.member 1,其类型为List Int -> Bool.

这意味着->在函数的类型注释中是右关联的。换句话说,a -> List a -> Bool是相同的a -> (List a -> Bool).

中缀和前缀表示法

Any 中缀运算符 http://elm-lang.org/docs/syntax#infix-operators实际上是一个普通的幕后函数。只是当函数名称仅由非字母数字符号(例如 $、

但你仍然可以放置一个二元运算符,例如+在 2 个参数前面,将其括在括号中,因此下面的 2 个函数应用程序是等效的:

2 + 3 -- returns 5
(+) 2 3 -- returns 5, just like the previous one

中缀运算符只是普通函数。他们没有什么特别的。您可以像任何其他函数一样部分应用它们:

addTwo : Int -> Int
addTwo = (+) 2

addTwo 3 -- returns 5

功能组成

(<<) http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Basics#%3C%3C是一个函数组合运算符,在核心库中定义Basics http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Basics。所有基础函数都被无条件导入到 Elm 项目中,这意味着您不必编写import Basics exposing (..),默认情况下已经完成了。

所以就像任何其他运营商一样,(<<)和其他函数一样,它只是一个函数。它的类型是什么?

(<<) : (b -> c) -> (a -> b) -> a -> c

Because ->是右结合的,这相当于:

(<<) : (b -> c) -> (a -> b) -> (a -> c)

换句话说,(<<)需要 2 个类型的函数b -> c and a -> b分别,并返回一个类型的函数a -> c。它将 2 个函数合二为一。这是如何运作的?为了简单起见,让我们看一个人为的例子。假设我们有两个简单的函数:

addOne = (+) 1
multTwo = (*) 2

假设我们没有(+), only addOne,我们如何创建一个加 3 而不是 1 的函数?很简单,我们就组成addOne一起3次:

addThree : Int -> Int
addThree = addOne << addOne << addOne

如果我们想要创建一个加 2 然后乘以 4 的函数该怎么办?

ourFunction : Int -> Int
ourFunction = multTwo << multTwo << addOne << addOne

(<<)从右到左组合函数。但上面的例子很简单,因为所有类型都是相同的。我们如何找到列表中所有偶数立方体的和?

isEven : Int -> Bool
isEven n = n % 2 == 0

cube : Int -> Int
cube n = n * n * n

ourFunction2 : List Int -> Int
ourFunction2 = List.sum << filter isEven << map cube

(>>)是相同的函数,但参数翻转,因此我们可以从左到右编写相同的组合:

ourFunction2 = map cube >> filter isEven >> List.sum

Recap

当你看到类似的东西时h << g << f,那么你就知道f, g, h是函数。当这个构造h << g << f应用于一个值x,那么你就知道:

  • 榆树首先适用f to x
  • 然后应用g到上一步的结果
  • 然后应用h到上一步的结果

所以(negate << (*) 10 << sqrt) 25 equals -50.0,因为首先对 25 求平方根,得到 5,然后将 5 乘以 10,得到 50,然后对 50 求反,得到 -50。

为什么

Elm 0.13 之前(参见公告 http://elm-lang.org/blog/announce/0.13) 函数复合运算符是(.),其行为与当前的相同(<<). (<<)在 Elm 0.13 中采用了 F# 语言(请参阅Github问题 https://github.com/elm-lang/elm-lang.org/issues/158)。还添加了 Elm 0.13(>>)相当于flip (<<), and (<|) http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Basics#%3C%7C作为函数应用运算符的替代品($), and (|>) http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Basics#%7C%3E相当于flip (<|).

中缀函数调用

您可能想知道是否可以将普通的字母数字函数名称转换为中缀二元运算符。在 Elm 0.18 之前,您可以使用反引号来使函数中缀,因此下面的 2 是等效的:

max 1 2 -- returns 2
1 `max` 2 -- returns 2

榆木 0.18删除了这个功能 https://github.com/elm-lang/elm-platform/blob/master/upgrade-docs/0.18.md#backticks-and-andthen。你不能再用 Elm 做到这一点,但是像这样的语言Haskell http://haskell.org and 纯脚本 http://purescript.org仍然有它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elm 中的“<<”运算符是什么意思? 的相关文章

  • 极限学习机(Extreme Learning Machine,ELM)详解

    ELM ELM的提出目的是为了解决人工神经网络训练时耗费的时间和高成本 对此 xff0c 2004年由南洋理工大学的黄广斌提出了ELM学习理论 机器或者生物学习可以不需要调整隐层节点 xff1a 给定任何连续目标函数或者可分类目标 xff0
  • ELM极限学习实现汽油辛烷值预测(MATLAB)

    什么是极限学习机 xff1f 极限学习机 xff08 ELM Extreme Learning Machines xff09 是一种前馈神经网络 xff0c 最早由新加坡南洋理工大学黄广斌教授于2006年提出 该算法具有良好的泛化性能以及极
  • 超限学习机(ELM)

    ELM Exteme learning machine 超限学习机 由新加坡南洋理工大学的Guangbin Huang 黄光斌 副教授提出的 1 算法概述 ELM算法针对的问题是单隐层的前馈神经网络 single hidden layer
  • 黄广斌谈ELM进展:为深度学习提供理论支持, 将勾连生物学习

    强大的深度神经网络 仍有很多待解决的问题 超限学习机 ELM 发明人 新加坡南阳理工大学副教授黄广斌认为 ELM能够有效地拓展神经网络的理论和算法 近日 黄广斌发表文章 超限学习机 筑梦普适学习和普适智能 Extreme learning
  • elm 生成随机数

    我想在 elm 中的两个值之间生成一个随机 int 像这样的东西 nb random 0 10 我已阅读该文档和多篇文章 最好的答案来自这个 stackoverflowpost gen Random int 0 10 seed0 Rando
  • 如何告诉 elm 外部 DOM 的变化

    我正在使用 elm 0 17 1 并尝试与 select2 javascript 库 版本 4 0 3 进行互操作 这是我的 Main elm port module Main exposing import Html exposing H
  • 在 Elm 中声明模块之外访问联合类型

    Given module 1 module Module1 exposing Message where type Message Test String Error Int module 2 module Module2 exposing
  • Elm:将包含单个元素的 JSON 数组解码为字符串

    看过类似的东西 但找不到确切的问题 我有一个从服务器端验证返回的 JSON 如下所示 field field name messages message message 我想做的是将其解码为 elm 记录 例如 field String m
  • Elm 与 ClojureScript 相比如何?

    我已经到了这样的地步 使用 Backbone js 面向对象的 MVC 模式进行 GUI 编码变得非常复杂 并且正在考虑其他范例 MDV https github com Polymer TemplateBinding FRP http e
  • 从更新函数触发操作

    有一个希望很简单的问题 当我在更新函数中收到操作 A 时 我想返回一个执行某些操作的任务 然后生成操作 B 更新函数再次接收该操作 B 据我了解 从 Update 返回的任何效果都将由 startapp 执行 但似乎什么也没有发生 这是一个
  • elm 中的类型继承

    我想要实现的是类型继承 我的意思是 我希望能够让函数返回 子类型 然后让函数返回 超类型 让我举一个例子 假设我有一个主视图组件 它返回一个 Html Msg view Model gt Html Msg view model div cl
  • 用于带有数据的 Union 类型的 Elm JSON 解码器

    我的 json 看起来像这样 name providerWithVal value example 或者像这样 name provider2 or name provider3 我的 Elm 联合类型定义如下 type Provider P
  • 在 Elm 中,有没有办法合并联合类型? (出于模块化目的)

    从这三个声明开始 type SharedMsg SharedAction type Page1Msg Page1Action type Page2Msg Page2Action 我有办法获得相当于以下内容的方法吗 就像一种 合并 联合类型的
  • Task.perform 期望第三个参数是不同的类型

    我正在尝试将 Elm 教程改编为我自己的小项目 但我在使用我提供的 Json Decoder 时遇到了麻烦 我的代码如下所示 type Msg RetrieveComments FetchSucceed String FetchFail H
  • ELM QueryString 解析器无法编译

    我真的很想学习一些 ELM 但是我的思想在查询解析时崩溃了 我的想法是创建一个函数来按名称获取查询字符串值 例如 给定一个查询字符串 name Neuber像这样的函数getParam name 那会返回Neuber 但它在最基本的例子中失
  • 从 JSON 文件读取数据

    假设我有一个 JSON 文件位于http www randomurl com jobs json http www randomurl com jobs json 它看起来像这样 jobs task turn burgers who Ann
  • 如何在 Elm 中换行 html 文本

    我有这样的文字 Special menu nFrenchfire 1ea nHamborger 2ea nMeatball 1ea 我想用 Html 标签在 Elm 中对其进行断线 例如pre or span它应该像这样显示 Special
  • elm 中的“<<”运算符是什么意思?

    以下代码取自榆树形式示例 http elm lang org edit examples Intermediate Form elm 第 122 行 什么是 lt lt 运算符的意思是 Field field Field defaultSt
  • 了解 Elm 中的通用联合类型

    我无法理解到底是什么Html msg类型是什么 或者它如何使用 我在 VirtualDom elm 中找到了这行代码 其中Html msg似乎是以下别名 type Node msg Node 这看起来像一个带有一个类型参数的通用联合类型 m
  • 在 0.19 中将自定义 HTML 与 elmreactor 或其他开发服务器结合使用

    As 这个答案 https stackoverflow com a 41366859 7943564显示可以在 Elm 0 18 中运行elm reactor如果此代码段包含在 HTML 文件中 则使用自定义 HTML 文件 然而 在 0

随机推荐