繁体   English   中英

有人能解释一下这个解决方案的工作原理

[英]Can some explain me how this solution works

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

有一个函数cons: const cons = (x, y) => f => f(x, y);

Cons将值存储到变量对: 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); 

这里cons(x, y)构造一个pair ,以及car(pair)cdr(pair)返回firstlast那个的元件pair

pair也是一个function ,它将函数作为输入,并将输入函数的输出作为xy


为了更好地解释您的解决方案:

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

将箭头函数重写为常规函数:

function car(pair){

   var result= pair(
   function temp(x, y){
     return x;
    }
   );
   return result;
}

这里

1. 汽车函数采用pair作为argument

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

2. pair是一个function ,它接受另一个函数作为输入,其中2个arguments有5,3作为value

............... => 对( ...... ;

3.这两个values作为argument传递,并在x, y分配x, y并返回x作为结果。

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


 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); function car(pair){ var result= pair( function temp(x, y){ return x; } ); return result; } const carCall = car(pair); const cdrCall = cdr(pair); console.log(carCall); console.log(cdrCall); 

很难回答你是如何“做到”的,因为你似乎偶然发现了答案。

通过发明一个在你还不知道答案时从未如此线性的思维过程来作弊,一种方法是首先仔细研究一下有什么cons

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

它需要两件事, (x, y) ,然后返回一个函数。
此函数接受另一个函数f并返回将该函数应用于给定cons(x, y)结果。

对于car ,我们想要提取这样一对的第一个元素。

要选择(x, y)的第一个元素,我们可以将它传递给函数

const first = (x, y) => x 

由于一对是一个接受函数并将该函数应用于其元素的东西,所以first传递给一对应该选择它的第一个元素:

(cons(3,5))(first)

是3。

但语法现在是“向后”,所以我们使用另一个函数来解决它:

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)并继续代替:

(pair => pair((x, y) => x)) (f => f(5,3))

-->

(f => f(5,3)) ((x, y) => x))

--> 

((x, y) => x)) (5,3)

--> 5

看看类型:

// 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并创建一对。 对是一个函数,它将另一个函数作为输入,并通过将其应用于xy来返回输入函数的输出。 这允许我们做一些事情,比如添加对的值(即cons(5, 3)((x, y) => x + y) ,其值为8 )。

现在,如果我们将该对应用于函数fstsnd那么我们分别得到该对的第一个值和第二个值。 因此, carcdr只是将输入对分别应用于函数fstsnd 希望有所帮助。

const cons = (x, y) => f => f(x, y);
const pair = cons(5, 3);
// pair = f => f(5, 3)
const car = pair => pair((x, y) => x);
// replace f as (x, y) => x
// then ((x, y) => x)(5, 3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM