C#函数式编程入门之Currying函数
本帖最后由 caozhy 于 2013-09-17 07:40:50 编辑 在函数式编程语言中,Currying函数是一个惯用的形式。
但是对于C#程序员来说,这比较陌生。
为了解释这个问题,我们看一个小例子:
Func<int, Func<int, int>> add = x => new Func<int, int>(y => x + y);
int i = add(3)(4);
Console.WriteLine(i);
Func<int, int> addTen = x => add(10)(x);
int j = addTen(i);
Console.WriteLine(j);
Func<int, Func<Func<int, Func<int, int>>, Func<int, int>>> eval =
x => new Func<Func<int, Func<int, int>>, Func<int, int>>(
y => new Func<int, int>(z => y(x)(z)));
Func<int, Func<int, int>> add = x => new Func<int, int>(y => x + y);
int i = eval(3)(add)(5);
Console.WriteLine(i);
Func<int, Func<int, int>> sub = x => new Func<int, int>(y => x - y);
i = eval(i)(sub)(1);
Func<Action<int>, Action<int[]>> iter = new Func<Action<int>,Action<int[]>>
(x => new Action<int[]>(y => { foreach (int i in y) x(i); }));
var OutputArray = iter(x => Console.WriteLine(x));
int[] data = { 1, 2, 3, 4, 5 };
OutputArray(data);
[解决办法]
写法很蛋疼,看起来更蛋疼
[解决办法]
挺有意思
实验:
Func<int, Func<int, int>> add = x => (y => x + y);
int n = 0;
var i = add(add(n++)(n++))(add(n++)(n++)); //6
n = 0;
var j = add(add(++n)(++n))(add(++n)(++n)); //10
Func<int, Func<Func<int, Func<int, int>>, Func<int, int>>> eval = x => y => z => y(x)(z);
var eval = x => y => z => y(x)(z);
Func<int, Func<int, int>> add = delegate(int x)
{
return (delegate(int y)
{
return x + y;
});
};
Func<int, Func<Func<int, Func<int, int>>, Func<int, int>>> eval = delegate(int x)
{
return (delegate(Func<int, Func<int, int>> y)
{
return delegate(int z)
{
return y(x)(z);
};
});
};
using System;
using System.Collections.Generic;
using System.Diagnostics;
internal static class LanguageFeatures
{
private static void DisplayProcesses( Func<Process , Boolean> match)
{
var processes = new List< Object>();
foreach (var process in Process.GetProcesses())
{
if (match(process))
{
processes.Add( new
{
process.Id,
Name = process.ProcessName,
Memory = process.WorkingSet64
});
}
}
ObjectDumper.Write(processes); //打印里面的内容,别处实现的
}
private static void Main( string[] args)
{
DisplayProcesses(process => process.WorkingSet64 >= 20*1024*1024);
}
}