シーケンス演算子を表現しようとしています
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 用語や教会数字のように表現する方法はありますか?
シーケンス演算子を表現しようとしています
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 用語や教会数字のように表現する方法はありますか?
「エラー」または「結果は...」というタイプが必要ですか?
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 つのメソッドだけでなく、型 (= エラーまたは結果)f
をg
返すことを考えると (= エラーまたは結果のいずれか) - 正式- シーケンス演算子は次のようになります (引数の順序が-operator と異なるのは偶然ではないと思います):Error
f,g :: T -> Error U
o
Lambda sequence = g => f => (z => bindError(g(z))(f))