[英]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)
返回first
和last
那个的元件pair
。
而pair
也是一个function
,它将函数作为输入,并将输入函数的输出作为x
和y
。
为了更好地解释您的解决方案:
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 :: a
和y :: b
并创建一对。 对是一个函数,它将另一个函数作为输入,并通过将其应用于x
和y
来返回输入函数的输出。 这允许我们做一些事情,比如添加对的值(即cons(5, 3)((x, y) => x + y)
,其值为8
)。
现在,如果我们将该对应用于函数fst
和snd
那么我们分别得到该对的第一个值和第二个值。 因此, car
和cdr
只是将输入对分别应用于函数fst
和snd
。 希望有所帮助。
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.