elm编写实例(Elm编程语言入门)
首发

elm编写实例(Elm编程语言入门)

优质
请用语音读文章

一、函数式编程的优点;

1. 前言

函数式编程(FP)是一种编程范式。渊源久远。与命令式编程、面向对象编程(OOP)合称为三大编程范式。也有专门的函数式编程语言。久远如大名鼎鼎的始祖LIST语言。近如haskell等。近年来。函数式编程有逐渐发展鼎盛的趋势。相对其余两种编程范式。它有如下特点和优势:

1.1 数据不可变。对外没有副作用;

函数式编程强调数据不可变。函数里面的数值是固定的。因此象randam这种随机数是不能放在函数里面。

1.2 纯函数;

一样的输入。通过函数可以有一样的输出。意即函数对外没有副作用。这次往函数里输入1输出10。下次还是这个结果。因此咱们可以十分放心地使用函数。不用担心它会对外造成污染和出现一些不可预料、难以测试的结果。

1.3 柯里化;

多参数的函数。可以通过柯里化转变成单参数的函数。便于组合和浏览理解。柯里化是函数式编程里一个重要的特征和功能。它能够进一步把逻辑抽象出来。举例:foo a = bar foo a这样形式的一个功能函数。柯里化后。转化成 foo = bar a。既可以易于重用又容易理解。

1.4 功能组合。不易出错;

函数化编程由于它的上述特点。在实际应用中。可以大幅减少代码量。也去除了大量烦人的大括号小括号。同时通过纯函数的组合作用。可以用简短的语令实现相当复杂的功能。可以理解为柯里化后的纯函数是一个个质量可靠的乐高积木。通过这些乐高积木为基本砖块搭建的建筑极其坚固。不易坍塌。

2. 近年来趋势;

近年来。函数式编程有逐渐发展鼎盛的趋势。如大名鼎鼎的facebook的前端js框架react以及跨端应用框架react native就是充分应用了函数式编程的范例。排名前几位的编程语言。如python、javascipt 、C++等。都可以把函数作为一等对象。实现函数式编程范式的充分条件。

二、elm语言的简要说明

1. 前端语言与javascript;

近年来。前端技术发展迅速。各种前端框架层出不穷。更进一步巩固了javascript语言在前端的的地位。如haskell、LIST等的函数式编程语言。多数用在后端。

2. javascript语言的不足及替代;

Javascript强大。是一种多范式语言。也非常适合于函数式编程。但它毕竟不是一种函数语言。而且动态类型也备受研究者鞭挞。同时。多范式语言便利。但也无形中局限研究者函数式编程思维模式。

 3. 近年兴起的函数式编程

 为此。聪明的大牛们创造了各种不一样的框架和语言。以弥补javascript的不足。语言如purescript、conjascript、coffescript等。框架如ramda等。成功推动了函数式编程在javascript中的开花结果。

 4. elm语言是其中的王者

 众多语言和框架中。elm是其中的王者。Elm语言是一种静态、纯函数式编程的语言。与其它函数式语言不同。elm是专门用于前端。与平时的前端网页研究三剑客:html、css、javascript同时上阵不同。elm能抛弃其它javascript库。单纯用elm语言来构建前端UI。实现其中的逻辑功能。而且更妙的是。如果你学会elm语言和函数式编程的精髓后。能用比javascript少50%左右的代码。构建出比react、VUE、等框架更快的模块。而且还不易出错。

5. 学会elm语言的优势

使用elm语言来写UI。能养育你的函数式编程思维。当研究者们用惯了命令式、面向对象式编程思维后。函数式编程能让你的编程技术更上一层楼。对于第一次开始学的人。函数式编程是打开了编程世界的一扇大门。门后是想象不到的风景。其中蕴涵人类智慧会令你赞叹不己。而elm。就是这扇大门。这串钥匙。下面。让咱们尝试探索一下elm世界的精妙之处。

三、Elm里的lambda函数指南

1. lambda函数定义

大部分编程语言中都会有lambdas函数。它是匿名函数的代名词。建立函数时通常需要有个定语。如“function”或“def”等。例如要在javascript中定义函数sum。一般如下:

Function sum(x) {

…功能定义

lambdas匿名函数可以把function、def这类定语去掉。直接定义函数。在elm语言中。lambdas匿名函数以“\”代替。

Elm中。匿名函数的基本语法形式是:”\”+参数+“->”+功能主体。“\”号是匿名函数的定义。匿名函数后可以加多个参数。“->”提醒后面是函数功能主体定义。

2. Elm中lambdas匿名函数实现以下功能

2.1 模式匹配

例如。实现统计列表中大于10的数字数量。代码以下:

Num:int

Num sumLarge = List.length <| List.filter(/xs>10) <| List.range 1 100

两行代码便可实现。其中第一行 Num int 提醒统计数量是一个int类型定义。List.range 1 100 是生成1至100的数字列表(elm中。函数参数间以空格隔开)。“<|”是级别最低的右关联符号。意即生成列表后把列表结果作为输入向右侧函数提交。List.filter是系统默认的梳理函数。其参数是一个lambdas匿名函数。意即遵从这个函数的功能对列表进行梳理。这个lambda匿名函数(/xs>10)的功能就非常的容易理解。把大于10的数字选出来。括号也完全可以取消。转化成 “<|”右关联函数 如<|xs>10。 当把大于10的数字filter选出来后结果也是一个列表。把列表作为输入右关联到函数List.length。就得出输出结果。梳理出的列表个数。这是个int类型的数字。与第一行定义num:int一致。

注意的是。lambda匿名函数虽然给了研究者便利。但不是什么情况下都要用。有那么一些情况下。不用lambdas更好。如要把列表里的数字简单加3映射一下:

Sum: a -> List a -> List b

Sum newList = List.map(/xs = xs + 3) xs

在上例中。会感觉newList函数定义得有那么一些拖油瓶。出现了三个xs。究其原因。是因为map映射函数后定义的lambdas匿名函数拖油瓶。其实完全可以如下所写:

Sum: a -> List a -> List b

Sum newList = List.map((+) 3) xs

原来 + 号也是一个lambda函数。简单定义 (+) 3 就把原先的 xs抽离。函数功能更加抽象。这就是纯函数的意义。

2.2 类型定义

Lambda函数还可以用作类型定义。例如。要实现一个参数交换的类型定义。显式如下:

Arg: (a,b,c) -> b -> a -> c

Flip f x y = f y x

如果用lambda匿名函数的话。可以如下:

Flip f = \x y = f y x

“\”号是lambdas匿名函数。 Flip函数用匿名函数定义。既易读又比较酷。 2.3 折叠功能

elm函数式编程中。map(映射)、fliter(过滤)、foldl、foldr(折叠)是常用的几个内置函数。map和fliter方才已经使用过了。现在尝试用foldl(左折叠)和foldr(右折叠)对列表元素进行折叠实现有趣的功能。

首先是实现最基本的sum累加函数:

Sum: List number -> number

Sum xs = List.foldl(\x acc->acc+x) 0 xs

Foldl是左向折叠。对象是xs列表。0是折叠的起始值(也称累加器)。(\x acc->acc+x)就是lambdas实现累加的匿名函数。foldl每向左折叠一个元素时。就把lambdas应用其它。象扑克牌一样。到最后就成为一叠(number)了。

下一步实现一个检查元素是否在列表里的member函数:

Member: a->List a->Bool

Member y ys = List.foldl(\x acc -> if x==y then True else acc) False ys

在上例里。最终输出是一个Bool布尔判断的结果(True or False)。False作为 foldl的初始值。如果不存在元素。就False。foldl折叠的动作就是一个lambda匿名函数(\x acc -> if x==y then True else acc)。意思是判断输入元素是否与列表映射元素相符。如果相符则初始值由False变为True。否则还是原封不动)。

好了。通过折叠函数和lambdas匿名函数。咱们顺利的制作了两个新函数:sum和member。纯净没有副作用。下来就可以利用这两个新函数。作为乐高积木的最小块。来尝试组合应用一下:

New1: List a ->Bool -> int

New1 result = sum <| member 1 [1,1,2,3,4]

得出结果是: 2

New2: list a ->Bool -> int

New2: result = sum <| member [1,2] [[1,2],[2,3],[3,4]]

得出结果是: 1

四、结语

  函数式编程。是未来的趋势。elm语言是前端特有的函数式编程语言。而学会函数式编程。lambda匿名函数是其中的精妙之一。和map(映射)、filter(过滤)、foldl(折叠)组合起来。变化无穷。编程的过程既奥妙又愉悦。本文只略作介绍。欢迎讨论。

以上就是由优质生活领域创作者 生活常识网 整理编辑的,如果觉得有帮助欢迎收藏转发~

分享到 :
相关推荐

dnf一天50个传说灵魂100级(DNF分解一个传说得几个传说灵魂)

请用语音读文章有位dnf玩家吐槽说。这12武器虽然拿到了。但是跨界却让我心态爆炸了[...

手机上网怎么赚钱(如何利用互联网赚钱)

请用语音读文章大多数人可能不知道。今日头条不止拍视频、发图文能赚钱。还有其他的方式[...

beyond歌曲大全100首(c调简谱大全100首)

请用语音读文章beyond。香港的传奇乐队。虽然现在黄家驹已经不在了。乐队也没啥起[...

结婚纪念日经典短句(简单一句话结婚纪念日)

请用语音读文章结婚纪念日经典短句1、虽然不是旷世奇缘。但却是难得一遇的良缘。祝福[&...

发表评论

您的电子邮箱地址不会被公开。