在 linq 中绑定表达式,无需变量赋值

本文关键字:变量 赋值 表达式 linq 绑定 | 更新日期: 2023-09-27 18:37:25

我用C#写了一个有点懒惰的IO类型的monad,并尝试使用linq语法使代码更具可读性。

有没有办法在没有变量赋值的情况下对仅为副作用而调用的操作进行绑定?

此示例中的Print(...)始终返回Void.Void

static IO<Void> Foo()
{
    var foo = from i in Return(2)
              from _1 in Print("Enter a number")
              from input in ReadInt()
              from _2 in Print("You entered: " + input)
              from j in Increment(input).Bind(Square)
              from sum in Add(j, input)
              from _3 in Print("i = " + i)
              from _4 in Print("j = " + j)
              from condition in GreaterThan(j, 10)
              from _5 in If(condition,
                  Print("j is greater than 10"),
                  Print("j is not greater than 10"))
              from _6 in Print("sum = " + sum)
              select Void.Void;
    return foo;
}

在 linq 中绑定表达式,无需变量赋值

不,这是不可能的。 你需要选择一些东西。

从根本上说,查询语法是为编写查询而设计的,而不是一般的 monads,因此在此上下文中使用时,语法不是特别有效或优雅。

对 monads 使用查询语法是一种有趣的智力练习,但它根本不实用。