我正在尝试在C#中完成以下操作。但是,为简洁起见,我使用函数/ Haskell样式的伪代码来说明我的观点。
想象一个函数exec
,它接受任意数量的参数。每个参数都是一个不带参数的委托,并产生一些结果:() => T
。 exec
执行所有提供的函数,并以多个结果返回结果。
var results = exec(func1, func2, ..., funcN);
//results will be (res1, res2, ..., resN)
如果我想用process
处理结果,我怎么能确定它在运行时不会失败,因为process
的输入类型与结果倍数之间有些不匹配?< / p>
var process = results@(_, res2, ..., _) => res2;
//this must be typesafe, IFF this compiles:
var finalResult = process(results);
我该怎么做?
一些额外的想法:
我可以想象仿制药可能会有所帮助,但我不确定如何。
以此为例以下代码:
var results = exec<T:ArgToResultTuple>(func1, func2, ...) // OR
var results = exec<T:ArgToResultTuple>(func[]{func1, func2, ...})
这种方法可以比普通的重载更具扩展性,因为如果我想容纳不同数量的args / results,我只需要创建一个新的ArgToResultTuple
子类。
另一种方法是构建像功能列表这样的结构,但这对最终用户来说不方便:
var results = exec(func1, exec(func2, func3));
var process = results@(_, (res2, _)) => res2
//will this be typesafe?:
var finalResult = process(results);