0

私はC#で次のことを達成しようとしています。ただし、簡潔にするために、機能的/Haskellスタイルの擬似コードを使用して主張しています。

exec任意の数の引数を取る関数を想像してください。各引数は、引数を取らないデリゲートであり、何らかの結果を生成します: () => T. exec提供されたすべての関数を実行し、その結果を倍数で返します。

var results = exec(func1, func2, ..., funcN);
//results will be (res1, res2, ..., resN)

結果を で処理したい場合、 my の入力タイプと結果の倍数processの間の不一致が原因で、実行時に失敗しないことをどのように確認できますか?process

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, ...})

ArgToResultTuple異なる数の引数/結果に対応したい場合にのみ新しいサブクラスを作成する必要があるため、このアプローチは単純なオーバーロードよりも拡張性があります。

さらに別の方法は、機能リストのような構造を構築することですが、これはエンド ユーザーにとって不便です。

var results = exec(func1, exec(func2, func3));
var process = results@(_, (res2, _)) => res2
//will this be typesafe?:
var finalResult = process(results);
4

0 に答える 0