1

シーケンス演算子を表現しようとしています

g*f = λz.(g z = error) -> error, (f o g)z

どこ

f o g = λz.f(g z)

C# でラムダ式を構築するためのデリゲートの使用

public delegate Lambda Lambda(Lambda x);

問題は、エラー項をエンコードする方法がわからないことです。True of False 用語や教会数字のように表現する方法はありますか?

4

1 に答える 1

0

「エラー」または「結果は...」というタイプが必要ですか?

Maybeそれは-Monad にほかなりません。ブール値と実際の結果のペアを介してエンコードします。

// you already have/know these:
Lambda lTrue = ...
Lambda lFalse = ...
Lambda not = ...
Lambda if = ...  // = Identity for usual church encoding of booleans

// "Pair" type
Lambda makePair = a => b => (f => f(a)(b));
Lambda getFst = pair => pair (a => b => a);
Lambda getSnd = pair => pair (a => b => b);

// "Error" type/monad
Lambda constError = makePair(lFalse)(null);
Lambda returnResult = result => makePair(lTrue)(result);

Lambda isError = error => not(getFst(error));
Lambda isResult = error => getFst(error);     // = getFst
Lambda getResult = error => getSnd(error);    // = getSnd

Lambda bindError = error => op => if(isResult(error))
                                      (op(getResult(error)))
                                      (constError);

2 つのメソッドだけでなく、型 (= エラーまたは結果)fg返すことを考えると (= エラーまたは結果のいずれか) - 正式- シーケンス演算子は次のようになります (引数の順序が-operator と異なるのは偶然ではないと思います):Errorf,g :: T -> Error Uo

Lambda sequence = g => f => (z => bindError(g(z))(f))
于 2013-09-14T17:21:56.160 に答える