可以给我解释一下该解决方案的工作原理

时间:2018-08-16 07:17:42

标签: javascript functional-programming

我通过反复试验解决了以下问题,但对我的操作方式仍然没有足够的了解。

有一个功能缺点:const cons = (x, y) => f => f(x, y);

将值存储在变量对中:const pair = cons(5, 3);

创建两个函数car和cdr,它们每个都将返回各自的参数。

car(pair); // 5

cdr(pair); // 3

我的解决方案:

const car = pair => pair((x, y) => x);

const cdr = pair =>pair((x,y) => y);

const cons = (x, y) => f => f(x, y);

const pair = cons(5, 3);

const car = pair => pair((x, y) => x);

const cdr = pair => pair((x,y) => y);

const carTest = car(pair);
const cdrTest = cdr(pair);

console.dir(carTest);
console.dir(cdrTest);

4 个答案:

答案 0 :(得分:1)

此处cons(x, y)构造了一个paircar(pair)cdr(pair)返回该first的{​​{1}}和last元素

pair也是pair,它以函数作为输入,并以functionx的形式返回输入函数的输出。


为您的解决方案提供更好的解释:

y

将箭头功能重写为常规功能:

const car = pair => pair((x, y) => x);

此处

1。汽车功能将function car(pair){ var result= pair( function temp(x, y){ return x; } ); return result; } 用作pair

  

const car = pair => ..............

2。argumentpair,它接受​​另一个函数作为输入,其中2个function的5个{3}为arguments

  

............... => 对( ...... )< / em> ;

3。。这2个value作为values传递并在argument中分配,并且返回x, y作为结果。

  

.........( (x,y)=> x );


x

答案 1 :(得分:1)

很难回答您的“操作方式”,因为您似乎迷失了答案。

通过发明一个思维过程来作弊,当您不知道答案时,思维过程就不会如此线性,一种解决方法是首先仔细观察cons的作用:

const cons = (x, y) => (f => f(x, y))

需要两件事,(x, y),然后返回一个函数。
该函数采用另一个函数f,并返回将该函数应用于给定(x, y)的{​​{1}}的结果。

对于cons,我们要提取此类对的第一个元素。

要选择car的第一个元素,我们可以将其传递给函数

(x, y)

由于一对是具有功能并将该功能应用于其元素的事物,因此将const first = (x, y) => x 传递给一对应该选择其第一个元素:

first

是3。

但是语法现在是“向后的”,因此我们使用另一个函数来扭转它:

(cons(3,5))(first)

替换const car = p => p(first) 的定义:

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)

答案 2 :(得分:1)

查看类型:

// cons :: (a, b) -> ((a, b) -> r) -> r
const cons = (x, y) => f => f(x, y);

// pair :: ((Number, Number) -> r) -> r
const pair = cons(5, 3);

// fst :: (a, b) -> a
const fst = (x, y) => x;

// snd :: (a, b) -> b
const snd = (x, y) => y;

// car :: (forall r. ((a, b) -> r) -> r) -> a
const car = pair => pair(fst);

// cdr :: (forall r. ((a, b) -> r) -> r) -> b
const cdr = pair => pair(snd);

如您所见,cons接受两个值x :: ay :: b并创建一个对。一对是将另一个函数作为输入并通过将 input函数的输出应用于xy的函数。这样一来,我们就可以执行诸如添加一对值(即cons(5, 3)((x, y) => x + y)的结果为8)之类的事情。

现在,如果将对应用于函数fstsnd,则分别获得该对的第一个值和第二个值。因此,carcdr分别将输入对分别应用于函数fstsnd。希望有帮助。

答案 3 :(得分:0)

$_POST