我正在尝试表达序列运算符
g*f = λz.(g z = error) -> error, (f o g)z
在哪里
f o g = λz.f(g z)
在 C# 中使用委托构造 lambda 表达式
public delegate Lambda Lambda(Lambda x);
问题是我不知道如何编码错误术语。有什么方法可以像 True of False 术语或 Church 数字那样表达它吗?
我正在尝试表达序列运算符
g*f = λz.(g z = error) -> error, (f o g)z
在哪里
f o g = λz.f(g z)
在 C# 中使用委托构造 lambda 表达式
public delegate Lambda Lambda(Lambda x);
问题是我不知道如何编码错误术语。有什么方法可以像 True of False 术语或 Church 数字那样表达它吗?
你的意思是你想要一个类型,要么说“错误”,要么说“结果是......”?
那只不过是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);
现在考虑到不仅您的两种方法f
并g
返回一个Error
类型(= 错误或结果) - 正式f,g :: T -> Error U
- 您的序列运算符看起来像这样(我认为您的参数顺序与o
-operator 不同并非偶然):
Lambda sequence = g => f => (z => bindError(g(z))(f))