我通过反复试验解决了以下问题,但对我的操作方式仍然没有足够的了解。
有一个功能缺点: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);
答案 0 :(得分:1)
此处cons(x, y)
构造了一个pair
,car(pair)
和cdr(pair)
返回该first
的{{1}}和last
元素
pair
也是pair
,它以函数作为输入,并以function
和x
的形式返回输入函数的输出。
为您的解决方案提供更好的解释:
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。。argument
是pair
,它接受另一个函数作为输入,其中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 :: a
和y :: b
并创建一个对。一对是将另一个函数作为输入并通过将 input函数的输出应用于x
和y
的函数。这样一来,我们就可以执行诸如添加一对值(即cons(5, 3)((x, y) => x + y)
的结果为8
)之类的事情。
现在,如果将对应用于函数fst
和snd
,则分别获得该对的第一个值和第二个值。因此,car
和cdr
分别将输入对分别应用于函数fst
和snd
。希望有帮助。
答案 3 :(得分:0)
$_POST