您的位置 首页 > 德语词汇

undefined是什么意思?用法、例句,函数式编程5の恼人的undefined

大家好,今天小编来为大家解答undefined是什么意思?用法、例句这个问题,函数式编程5の恼人的undefined很多人还不知道,现在让我们一起来看看吧!

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

letyes=f=>y=>f();letno=x=>f=>f();letwhen=c=>c;

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

undefined是什么意思?用法、例句,函数式编程5の恼人的undefined

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

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

letpair=l=>r=>f=>f(l)(r);letleft=p=>p(l=>_=>l);letright=p=>p(_=>r=>r);letnil=pair(undefined)(undefined);letcon=h=>t=>pair(h)(t);lethead=left;lettail=right;

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

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

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

letis_undefined=n=>n===undefined?yes:no;

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

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

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

letundef=(_=>_)();

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

letis_undef=n=>n===undef?yes:no;重構

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

letpair=l=>r=>f=>f(l)(r);letleft=p=>p(l=>_=>l);letright=p=>p(_=>r=>r);letnil=pair(undef)(undef);letcon=h=>t=>pair(h)(t);lethead=left;lettail=right;

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

letisEmpty=l=>is_undef(head(l));

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

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

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

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

letrcon=t=>h=>when(is_undef(h))(_=>t)(_=>rcon(con(h)(t)));letrev=r=>l=>when(isEmpty(l))(_=>r)(_=>rev(con(head(l))(r))(tail(l)));letreverse=l=>rev(nil)(l);letelems=rcon(nil);letlist=es=>reverse(es());

来试试看:

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

实现一下函数:map

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

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

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

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

functionarray(lt){functionarr(acc,l){if(isEmpty(l)===yes){returnacc;}else{returnarr(acc.concat([head(l)]),tail(l));}}returnarr([],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)-

undefined是什么意思?用法、例句和函数式编程5の恼人的undefined的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023