Javascript 能给我解释一下这个解决方案是如何工作的吗
我通过反复试验解决了以下问题,但仍然没有正确理解我是如何做到这一点的 有一个函数cons:Javascript 能给我解释一下这个解决方案是如何工作的吗,javascript,functional-programming,Javascript,Functional Programming,我通过反复试验解决了以下问题,但仍然没有正确理解我是如何做到这一点的 有一个函数cons:constcons=(x,y)=>f=>f(x,y) Cons将值存储到变量对:constpair=Cons(5,3) 创建两个函数car和cdr,它们各自返回各自的参数 汽车(成对);//5 cdr(成对);//3 我的解决方案: const car=pair=>pair((x,y)=>x) constcdr=pair=>pair((x,y)=>y) constcons=(x,y)=>f=>f(x,y)
constcons=(x,y)=>f=>f(x,y)代码>
Cons将值存储到变量对:constpair=Cons(5,3)代码>
创建两个函数car和cdr,它们各自返回各自的参数
汽车(成对);//5
cdr(成对);//3
我的解决方案:
const car=pair=>pair((x,y)=>x)代码>
constcdr=pair=>pair((x,y)=>y)代码>
constcons=(x,y)=>f=>f(x,y);
常数对=cons(5,3);
const car=pair=>pair((x,y)=>x);
常数cdr=pair=>pair((x,y)=>y);
常数carTest=车辆(对);
常数cdrTest=cdr(对);
console.dir(卡特斯特);
console.dir(cdrTest)
这里cons(x,y)
构造一个对
,car(对)
和cdr(对)
返回该对的第一个和最后一个元素
而pair
也是一个函数
,它将函数作为输入,并将输入函数的输出返回为x
和y
要更好地解释您的解决方案:
const car = pair => pair((x, y) => x);
function car(pair){
var result= pair(
function temp(x, y){
return x;
}
);
return result;
}
将箭头函数重写为常规函数:
const car = pair => pair((x, y) => x);
function car(pair){
var result= pair(
function temp(x, y){
return x;
}
);
return result;
}
这里
1.Car函数将对
作为参数
const car=pair=>
2.对
是一个函数
,它接受另一个函数作为输入,其中2个参数
具有5个值
对(…)
3.这两个值
作为参数
传递,并分配到x,y
中,并且x
作为结果返回
((x,y)=>x)
constcons=(x,y)=>f=>f(x,y);
常数对=cons(5,3);
//const car=pair=>pair((x,y)=>x);
常数cdr=pair=>pair((x,y)=>y);
多功能车(双){
var结果=对(
功能温度(x,y){
返回x;
}
);
返回结果;
}
const carCall=车辆(成对);
const cdrCall=cdr(成对);
控制台日志(carCall);
console.log(cdrCall)代码>很难回答你是如何“做到的”,因为你似乎在答案上绊倒了
在你还不知道答案的情况下,通过发明一个从来都不是线性的思维过程来作弊,一种方法是首先仔细观察cons
的作用:
const cons = (x, y) => (f => f(x, y))
它需要两件事,(x,y)
,然后返回一个函数。
此函数接受另一个函数f
,并返回将该函数应用于给定的(x,y)
的结果
对于car
,我们希望提取这样一对的第一个元素
要选择(x,y)
的第一个元素,我们可以将其传递给函数
const first = (x, y) => x
由于配对是一种接受函数并将该函数应用于其元素的事物,因此将first
传递给配对应选择其第一个元素:
(cons(3,5))(first)
是3
但是语法现在是“向后的”,所以我们使用另一个函数来扭转它:
const car = p => p(first)
首先替换的定义
:
const car = p => p((x,y) => x)
同样的过程会产生cdr
要想知道到底发生了什么,你必须
const pair = cons(5, 3);
替换cons
的定义:
const pair = f => f(5, 3);
将car
应用于f=>f(5,3)
并继续替换:
(pair => pair((x, y) => x)) (f => f(5,3))
-->
(f => f(5,3)) ((x, y) => x))
-->
((x, y) => x)) (5,3)
--> 5
看看这些类型:
//缺点::(a,b)->(a,b)->r)->r
常数cons=(x,y)=>f=>f(x,y);
//配对::((数字,数字)->r)->r
常数对=cons(5,3);
//fst::(a,b)->a
常数fst=(x,y)=>x;
//snd::(a,b)->b
常数snd=(x,y)=>y;
//汽车::(对于所有右侧)((a,b)->r)->r)->a
const car=pair=>pair(fst);
//cdr::(对于所有r.((a,b)->r)->r)->b
常数cdr=pair=>pair(snd);
如您所见,cons
获取两个值x::a
和y::b
,并创建一对。pair是一个函数,它接受另一个函数作为输入,并通过将其应用于x
和y
来返回输入函数的输出。这允许我们做一些事情,比如添加对的值(即cons(5,3)((x,y)=>x+y)
,计算结果为8
)
现在,如果我们将该对应用于函数fst
和snd
,则分别得到该对的第一个值和第二个值。因此,car
和cdr
只需将输入对分别应用于函数fst
和snd
。希望这能有所帮助。我有时发现将箭头函数重写为常规函数很有帮助-这使闭包和返回值更容易理解(至少对我来说是这样)。我做到了。在解决练习时仍然存在问题。虽然此代码片段可能是解决方案,但包含解释确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您代码建议的原因。谢谢您的建议。这是基于Haskell的答案吗?是的,是的。根据您的个人资料,您对Scheme和Haskell都有了解。根据您的意见,对于初学者javascript程序员来说,哪一个更有利于在FP中取得好成绩?既然您已经了解javascript,我建议您选择Haskell。Scheme类似于JavaScript。因此,通过学习Haskell,您将比通过学习Scheme了解更多关于FP的知识。网上有一本很棒的书叫《学你一个哈斯克尔》。你应该读一读。第一部分带来了一些启示。你知道我在哪里可以找到类似的练习吗