gpt4 book ai didi

c# - 需要帮助理解 lambda(柯里化(Currying))

转载 作者:太空狗 更新时间:2023-10-29 19:52:45 24 4
gpt4 key购买 nike

我正在阅读 Accelerated C# 我不太理解以下代码:

public static Func<TArg1, TResult> Bind2nd<TArg1, TArg2, TResult> (
this Func<TArg1, TArg2, TResult> func,
TArg2 constant )
{
return (x) => func( x, constant );
}

在最后一行中,x 指的是什么?还有一个:

public static Func<TArg2, Func<TArg1, TResult>> Bind2nd<TArg1, TArg2, TResult>
( this Func<TArg1, TArg2, TResult> func )
{
return (y) => (x) => func( x, y );
}

我如何评价这个? (y) => (x) => func( x, y ) 传递的内容...它确实令人困惑。

最佳答案

让我们首先简化代码:

Func<int, int> B(Func<int, int, int> f, int c)
{
return x=>f(x, c);
}

这与:

class Locals
{
public int c;
public Func<int, int, int> f;
public int Magic(int x) { return f(x, c); }
}
Func<int, int> B(Func<int, int, int> f, int c)
{
Locals locals = new Locals();
locals.f = f;
locals.c = c;
return locals.Magic;
}

现在清楚x指的是什么了吗? x 是函数“Magic”的参数。

现在你可以像这样使用 B 了:

Func<int, int, int> adder = (a, b)=>a+b;
Func<int, int> addTen = B(adder, 10);
int thirty = addTen(20);

有道理吗?看看这里发生了什么?我们采用两个参数的函数并将其中一个参数“固定”为常量。所以它变成了一个参数的函数。

第二个例子更进一步。再次强调,简化以摆脱麻烦,以便您可以更轻松地理解它:

Func<int, Func<int, int>> B2(Func<int, int, int> f) 
{
return y=>x=>f(x,y);
}

这是一样的

class Locals3
{
public int y;
public int Magic3(int x)
{
return x + this.y;
}
}
class Locals2
{
public Func<int, int, int> f;
public Func<int, int> Magic2(int y)
{
Locals3 locals = new Locals3;
locals.y = y;
return locals.Magic3;
}
}

Func<int, Func<int, int>> B2(Func<int, int, int> f)
{
Locals2 locals = new Locals2();
locals.f = f;
return locals.Magic2;
}

你说

Func<int, int, int> adder = (a, b)=>a+b;
Func<int, Func<int, int>> makeFixedAdder = B2(adder);
Func<int, int> add10 = makeFixedAdder(10);
int thirty = add10(20);

B 是参数固定器。 B2 为您制作参数修复器

然而,这不是 B2 的。 B2的要点是:

adder(20, 10);

给出与

相同的结果
B2(adder)(20)(10)

B2 将一个两个参数的函数变成两个一个参数的函数

有道理吗?

关于c# - 需要帮助理解 lambda(柯里化(Currying)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com