Tag: currying

使用不同类型的args在Func之间转换

是否有内置的方法在各种类型的Func代理之间进行转换? 也就是说,假设您需要一个Func,但是您有一个Func(并且您具有应该传入T参数的值)。 例如: static TREsult Foo(Func f) { // … TResult result = f(); // … return result; } static int MyFunc(int i) { return i; } void CallFoo() { Func func = ConvertFunc(MyFunc, 1); // Does this family of methods exist? int j = Foo(func); } 我写了自己的,像这样: static Func ConvertFunc(Func f1, T t) { […]

需要帮助了解lambda(currying)

我正在阅读Accelerated C#我真的不明白以下代码: public static Func Bind2nd ( this Func func, TArg2 constant ) { return (x) => func( x, constant ); } 在最后一行x指的是什么? 还有另一个: public static Func<TArg2, Func> Bind2nd ( this Func func ) { return (y) => (x) => func( x, y ); } 我该如何评价这个? (y) => (x) => func( x, y )传递的地方……它确实令人困惑。

.Net是否支持curried的generics?

假设我们有一个嵌套的generics类: public class A { public class B { } } 这里, typeof(A.B)本质上是一个具有两个参数的generics类,其中只有第一个被绑定。 如果我有一个带有两个参数的单个类 public class AB { } 有没有办法引用“ AB与T=int和U保持开放”? 如果不是,这是C#限制还是CLR限制?

Currying在C#中的优势是什么? (实现部分function)

Currying在C#中的优势是什么? 在curry函数上实现部分函数应用的优点是什么?

(如何)绑定/重新绑定方法以使用不同签名的委托?

我是一个c ++开发人员,在c ++中使用了信号和插槽,这对我来说似乎与c#中的委托类似。 我发现自己在寻找“绑定”提供的function时感到很茫然,并且觉得我必须遗漏一些东西。 我觉得像C ++这样的东西应该可以在c#中使用委托。 这里有一些psudo代码,用于我将在c ++中做什么: Slot someCallback; int foo(int i) { std::cout << "Value: " << i << "\n"; return i; } int main() { int i = 0; Slot someCallback = bind( fun_ptr(foo), i ); ++i; // added to show that late evaluation would be a non-trivial difference int result = […]

C#Linq vs. Currying

我正在使用函数式编程及其各种概念。 所有这些都非常有趣。 我曾几次读过Currying以及它有什么优势。 但我不明白这一点。 以下来源演示了咖喱概念的使用和linq的解决方案。 实际上,我没有看到任何使用currying概念的建议。 那么,使用currying有什么好处? static bool IsPrime(int value) { int max = (value / 2) + 1; for (int i = 2; i < max; i++) { if ((value % i) == 0) { return false; } } return true; } static readonly Func<IEnumerable, IEnumerable> GetPrimes = HigherOrder.GetFilter().Curry()(IsPrime); static void Main(string[] args) […]

为什么C#编译器不能从函数签名推断generics类委托?

我正在使用一个函数,它将两个函数作为参数,并返回一个新的组合函数: public static Action Compose(Action first, Action second) { return new Action(arg => { first(arg); second(); }); } 我注意到编译器抱怨如果我没有指定T ,当发送静态或成员函数时(而不是实际的Action对象): static void Main(string[] args) { // compiler error here var composed = Compose(Test, () => Console.WriteLine(” world”)); composed(“hello”); Console.ReadLine(); } public static void Test(string arg) { Console.Write(arg); } 错误消息: 无法从用法中推断出方法’ConsoleTest.Program.Compose(System.Action,System.Action)’的参数。 尝试显式指定类型参数。 我的问题 :为什么不能在这里推断出类型论证? Test的签名在编译时是已知的,不是吗? 是否真的有一些function可以代替Test […]

“Uncurrying”.NET中的实例方法

您是否可以创建实例方法的委托而无需在创建时指定实例? 换句话说,你可以创建一个“静态”委托,它应该调用该方法的实例作为它的第一个参数吗? 例如,如何使用reflection构造以下委托? Func = i=>i.ToString(); 我知道我可以使用methodInfo.Invoke,但速度较慢,并且在调用之前不检查类型正确性。 当您拥有特定静态方法的MethodInfo时,可以使用Delegate.CreateDelegate(delegateType, methodInfo)构造委托,并且静态方法的所有参数都保持空闲。 正如Jon Skeet指出的那样,如果方法在引用类型上是非虚拟的,则可以简单地应用相同的方法来创建实例方法的开放委托。 决定在虚拟方法上调用哪个方法很棘手,因此不是那么简单,值类型看起来根本不起作用。 对于值类型, CreateDelegate表现出非常奇怪的行为: var func37 = (Func)(37.ToString); var toStringMethod = typeof(int).GetMethod(“ToString”, BindingFlags.Instance | BindingFlags.Public, null, new Type[] {typeof(CultureInfo) }, null); var func42 = (Func)Delegate.CreateDelegate(typeof(Func), 42, toStringMethod,true); Console.WriteLine( object.ReferenceEquals(func37.Method,func42.Method)); //true Console.WriteLine(func37.Target);//37 Console.WriteLine(func42.Target);//42 Console.WriteLine(func37(CultureInfo.InvariantCulture));//37 Console.WriteLine(func42(CultureInfo.InvariantCulture));//-201040128… WTF? 如果实例方法属于值类型(这适用于引用类型),则使用null作为目标对象调用CreateDelegate会引发绑定exception。 几年后的一些后续行动:导致func42(CultureInfo.InvariantCulture);的错误绑定目标func42(CultureInfo.InvariantCulture); 在我的示例中返回”-201040128″而不是”42″是内存损坏,可能允许远程代码执行( cve-2010-1898 ); 这是在2010年ms10-060安全更新中修复的。 当前框架正确打印42! 这并没有使回答这个问题变得更容易,但解释了这个例子中特别奇怪的行为。