【问题标题】:Sequence operator and error term序列运算符和错误项
【发布时间】:2013-04-08 13:26:55
【问题描述】:

我正在尝试表达序列运算符

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 数字?

【问题讨论】:

    标签: c# lambda lambda-calculus


    【解决方案1】:

    你的意思是你想要一个类型,要么是“错误”,要么是“结果是……”?

    那只不过是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);
    

    现在考虑到不仅fg 两种方法返回Error 类型(= 错误或结果)-正式的f,g :: T -> Error U-您的序列运算符看起来像这样(我认为这不是偶然的您的参数顺序与o-operator 不同):

    Lambda sequence = g => f => (z => bindError(g(z))(f))
    

    【讨论】:

      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多