Javascript 能给我解释一下这个解决方案是如何工作的吗

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)

我通过反复试验解决了以下问题,但仍然没有正确理解我是如何做到这一点的

有一个函数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);
常数对=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的知识。网上有一本很棒的书叫《学你一个哈斯克尔》。你应该读一读。第一部分带来了一些启示。你知道我在哪里可以找到类似的练习吗