​函数式编程语言 优化 函数式编程语言排行榜

函数式编程语言 优化 函数式编程语言排行榜

来看看〈是的! 不是!〉中到底定义了什么?

let yes = f => y => f(); let no = x => f => f(); let when = c => c;

三个函数? 不! 三个“值”! 函数也是值! 因此 是个值, 也是个值,既然如此,可以用来替代仍借助于 JavaScript 的 、 吗? 可以的!yesnotruefalse

lambda 表示式就是值

这也给个机会,重新思考什么是值? 在多数程序语言中,值就是个定义好的符号,像是、、、、等,在 lambda 演算的世界中,lambda 表示式就是值,可以用 lambda 表示式来定义 、,这边的 、 就是实际的例子,进一步地 、、 也可以用 lambda 表示式来定义(这在后面的篇幅会谈到)。

truefalse123truefalseyesno123

来试着不使用 、、 来完成 如何? 首先,List 的结构不用修改:?:truefalsemap(list(elems(1)(2)(3)))(elem => elem – 1)

let pair = l => r => f => f(l)(r); let left = p => p(l => _ => l); let right = p => p(_ => r => r); let nil = pair(undefined)(undefined); let con = h => t => pair(h)(t); let head = left; let tail = right;

接下来,看看,若有个代表着List,现在希望必须传回、而不是、,主要是看看首元素有没有定义,虽然可以写,不过来想想看,它该算是个值吗?let isEmpty = lt => head(lt) === undefined;

ltisEmptyyesnotruefalseisEmptylet isEmpty = lt => head(lt) === undefined ? yes : no;undefined

定义 undef

undefined 是值吗? 或者只是个唯一的符号? 表示没有东西、也不是容器、没有对应的操作,什么也没有?undefined

若就 JavaScript 来说,将 当成一个值,因此,就目前来说可以利用这点,在目前的箭号函数表示中,将 当成是符号,让 JavaScript 代为判断 是 还是 :

undefinedundefinedundefinedyesnolet is_undefined = n => n === undefined ? yes : no;

从 lambda 演算的角度来看, 会是个黑箱,是运算机器(这边就是 JavaScript 环境)的一部份,因此使用 、 就不是问题,这黑箱只要看看是不是 符号,写下 或 的 lambda 表示式就是了。is_undefined===?:undefinedyesno

实际上在目前的箭号符号表示方式中,有些地方虽然没有写出 ,然而隐含着使用了 这个符号,例如,有个函式 ,若以执行,就 JavaScript 环境来说, 就会是 ,也就是就 lambda 表示式来说,可以看成是 ,隐含地传入了 符号。undefinedundefinedf = x => x + 1f()xundefinedf(undefined)undefined

如果直接使用 真的让你感到不舒服,那就来定义一个 好了:undefinedundef

let undef = (_ => _)();

就 lambda 演算角度来看, 像是个 lambda 表示式,如果以人力来运算,就是看看是不是 ,确定是不是未定值的表示式;如果使用 JavaScript 执行环境来运算, 也还是 ,最终,还是依然有个黑箱:(_ => _)()(_ => _)()undefundefined

let is_undef = n => n === undef ? yes : no;

重構

雖然黑箱依然存在,然而就目前來說,這可以讓事情簡單一些,最終的運算表示式中,也可以不出現 這個 JavaScript 中的元素,爽度應該會高一些。例如 List 的相關定義現在可以是:undefined

let pair = l => r => f => f(l)(r); let left = p => p(l => _ => l); let right = p => p(_ => r => r); let nil = pair(undef)(undef); let con = h => t => pair(h)(t); let head = left; let tail = right;

于是, 现在可以返回 、 了:isEmptyyesno

let isEmpty = l => is_undef(head(l));

接下来,可以实现几个简单的函数,像是 、 之类的:lensum

let len = l => when(isEmpty(l)) (_ => 0) (_ => 1 + len(tail(l))); let sum = l => when(isEmpty(l)) (_ => 0) (_ => head(l) + sum(tail(l)));

别忘了,由于 、、 实现了惰性, 接下来的两个值,必须是个函式,在这边略为排版了一下,看起来像是有了新的语言了。whenyesnowhen

在〈是的! 不是!〉也谈过, 只是增加一层语义,实际上什么也不做,也就是说,上例中的 直接写为 ,函式也可以正常运作,就上面两个函式来说,由于 名称上还算清楚,是可以这么做,然而若不是这类的名称,加上还是比较好的方式。whenwhen(isEmpty(l))isEmpty(l)isEmptywhen

接下来重构一下 等函数:list

let rcon = t => h => when(is_undef(h)) (_ => t) (_ => rcon(con(h)(t))); let rev = r => l => when(isEmpty(l)) (_ => r) (_ => rev(con(head(l))(r))(tail(l))); let reverse = l => rev(nil)(l); let elems = rcon(nil); let list = es => reverse(es());

来试试看:

let lt = list(elems(1)(2)(3)(4)); console.log(len(lt)); // 4 console.log(sum(lt)); // 10

实现一下 函数 :map

let map = l => f => when(isEmpty(l)) (_ => nil) (_ => con(f(head(l)))(map(tail(l))(f)));

如果有个辅助函数为 ,可以将List转为 JavaScript 阵列,那么底下会显示 [0, 1, 2]:array

let lt2 = map(list(elems(1)(2)(3)))(elem => elem – 1); console.log(array(lt2));

辅助用的函数与 lambda 演算没直接关系,代码如下:

function array(lt) { function arr(acc, l) { if(isEmpty(l) === yes) { return acc; } else { return arr(acc.concat([head(l)]), tail(l)); } } return arr([], lt); }

来试着像之前那样,将 全部使用箭号函数表示:map(list(elems(1)(2)(3)))(elem => elem – 1)

(f => (x => f(n => x(x)(n)))(x => f(n => x(x)(n))))(map => l => f => (l => is_undef((p => p(l => _ => l))(l)))(l)(_ => ((l => r => f => f(l)(r))((_ => _)())((_ => _)())))(_ => (h => t => (l => r => f => f(l)(r))(h)(t))(f((p => p(l => _ => l))(l)))(map((p => p(_ => r => r))(l))(f))))((es => (l => ((f => (x => f(n => x(x)(n)))(x => f(n => x(x)(n))))(rev => r => l => (l => is_undef((p => p(l => _ => l))(l)))(l)(_ => r)(_ => rev((h => t => (l => r => f => f(l)(r))(h)(t))((p => p(l => _ => l))(l))(r))((p => p(_ => r => r))(l)))))((l => r => f => f(l)(r))((_ => _)())((_ => _)()))(l))(es()))((f => (x => f(n => x(x)(n)))(x => f(n => x(x)(n))))(rcon => t => h => is_undef(h)(_ => t)(_ => rcon((h => t => (l => r => f => f(l)(r))(h)(t))(h)(t))))((l => r => f => f(l)(r))((_ => _)())((_ => _)()))(1)(2)(3)))(elem => elem – 1)

想要在 JavaScript 环境中执行上面的箭号函式的话,只需要有 的定义,也就是这个黑箱作为环境边界。is_undef

如果不打算将环境边界定得那么严格,可以将 替换为以下,就可以直接运算得到结果了:is_undef

n => n === (_ => _)() ? (f => y => f()) : (x => f => f())`,成為 `(f => (x => f(n => x(x)(n)))(x => f(n => x(x)(n))))(map => l => f => (l => (n => n === (_ => _)() ? (f => y => f()) : (x => f => f()))((p => p(l => _ => l))(l)))(l)(_ => ((l => r => f => f(l)(r))((_ => _)())((_ => _)())))(_ => (h => t => (l => r => f => f(l)(r))(h)(t))(f((p => p(l => _ => l))(l)))(map((p => p(_ => r => r))(l))(f))))((es => (l => ((f => (x => f(n => x(x)(n)))(x => f(n => x(x)(n))))(rev => r => l => (l => (n => n === (_ => _)() ? (f => y => f()) : (x => f => f()))((p => p(l => _ => l))(l)))(l)(_ => r)(_ => rev((h => t => (l => r => f => f(l)(r))(h)(t))((p => p(l => _ => l))(l))(r))((p => p(_ => r => r))(l)))))((l => r => f => f(l)(r))((_ => _)())((_ => _)()))(l))(es()))((f => (x => f(n => x(x)(n)))(x => f(n => x(x)(n))))(rcon => t => h => (n => n === (_ => _)() ? (f => y => f()) : (x => f => f()))(h)(_ => t)(_ => rcon((h => t => (l => r => f => f(l)(r))(h)(t))(h)(t))))((l => r => f => f(l)(r))((_ => _)())((_ => _)()))(1)(2)(3)))(elem => elem – 1)

还有可能再进一步吗? 例如, 中,连 1、2、3 甚至 都用箭号函式来表示? 似乎是可以挑战看看的对象…map(list(elems(1)(2)(3)))(elem => elem – 1)-

相关推荐

​零基础学Java-什么是Java?Java语言的特性

​零基础学Java-什么是Java?Java语言的特性

129

零基础学Java-什么是Java?Java语言的特性 Java 从诞生以来就一直活跃于企业中,名企应用天猫,百度,知乎……都是Java语言编写,就连现在使用广泛的XMind也是Java编写的。Java应用的广泛...

​立陶宛人口和面积(立陶宛位于哪里?)

​立陶宛人口和面积(立陶宛位于哪里?)

101

立陶宛人口和面积(立陶宛位于哪里?) 立陶宛全称:立陶宛共和国 位于波罗的海东岸(这个位置很难讲清楚,必须看地图) 四个邻国: 1、西南两个邻国:波兰、俄罗斯(飞地) 2、东...

​鳐鱼怎么读(鳐鱼怎么读拼音怎么写)

​鳐鱼怎么读(鳐鱼怎么读拼音怎么写)

187

鳐鱼怎么读(鳐鱼怎么读拼音怎么写) 接触茶开始,就常常听到茶圣陆羽的大名,他所著的《茶经》则被誉为茶叶百科全书。各式各样的茶书推荐清单里,这本总是在榜。本着一探究竟的...

​苹果快捷指令(苹果快捷指令nfc门禁卡教程)

​苹果快捷指令(苹果快捷指令nfc门禁卡教程)

185

苹果快捷指令(苹果快捷指令nfc门禁卡教程) 1CommandX剪切所选项并拷贝到剪贴板2CommandC将所选项拷贝到剪贴板这同样适用于“访达”中的文件3CommandV将剪贴板的内容粘贴到当前文稿或应用...

​国骂是什么(国骂是国粹吗)

​国骂是什么(国骂是国粹吗)

188

国骂是什么(国骂是国粹吗) 本篇文章给大家谈谈国骂是什么,以及国骂是国粹吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 鲁迅说的国骂是什么 鲁迅先生曾写过一...

​tweet怎么读(tweettweet怎么读英文)

199

tweet怎么读(tweettweet怎么读英文) 1、tweet读英 twi#720t,美 twi#720t小鸟的唧啾,吱喳复数tweets短语 Bird Tweet鸟鸣,鸟鸣声,鸟鸣叫, 鸟叫Promoted Tweet推广消息,广告推,推广推文,推广微博...

​为什么火生土(为什么火生土 土生金)

​为什么火生土(为什么火生土 土生金)

188

为什么火生土(为什么火生土 土生金) 为什么说火生土克金? 在五行学说里面,火是克金的,金在古代代表的是武器类的铁具,而火刚好可以熔炼铁具,所以在相生相克的属性上,火...

​语文知识点结构框架图 语文知识点归纳图

186

语文知识点结构框架图 语文知识点归纳图 语文知识体系框架(总论) 一:字词基础 1.1:汉字拼音:声韵母/声调/规则/课本生字解析听写4200 1.2:汉字结构:六书/笔顺/笔画/偏旁/结构...

​世界顶级冰箱排名 世界十大顶级冰箱品牌

​世界顶级冰箱排名 世界十大顶级冰箱品牌

125

世界顶级冰箱排名 世界十大顶级冰箱品牌 由于世界上有许多领先的冰箱品牌,无论是小品牌还是大品牌,选择一个品牌或正确的冰箱品牌可能会变得很困难。这就是为什么您需要我们...

​补壹刀是什么人 补壹刀简介

​补壹刀是什么人 补壹刀简介

175

补壹刀是什么人 补壹刀简介 来源:补壹刀 执笔/李小飞刀渣渣刀 “乌拉族”。 “乌拉”,俄语中“万岁”一词的音译。最近,中国境内社交媒体一些账号开始传播这个词,来攻击贬低...

​从田间到餐桌的句子 田间村庄

195

从田间到餐桌的句子 田间村庄 乡村振兴,大有可为。 十九大报告首次明确提出,始终把解决好“三农”问题作为工作的重中之重,实施乡村振兴战略。遍布广大城镇乡村的毛细血管组...

​最富哲理的9个汉字,说透老祖宗的9种智慧

171

最富哲理的9个汉字,说透老祖宗的9种智慧 一个汉字,就是一部文化史。 作者:洞见MK 汉字,是世界上最古老、最富有生命力的文字之一。 字形的一笔一画之间,串联起的是千百年来...

​男友的秘密交警查车 男友的秘密结局知乎

84

男友的秘密交警查车 男友的秘密结局知乎 07 突然,我的眼前出现了一双赤裸的双脚。 那女人就站在我藏身的沙发前面! 我惊恐地捂住了嘴巴,但还是有一丝微弱的呼吸声泄露了出去。...

​转行后不适应,要换工作吗 转行难吗?

74

转行后不适应,要换工作吗 转行难吗? (本文首发于“刘润”公号,订阅“刘润”公号,和170万读者一起洞察商业本质) 最近有同学问了我两个问题: 职业转型前需要考虑些什么? 转行...