我在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;
}
答案 0 :(得分:1)
不,那是不可能的。你需要选择一些东西。
从根本上说,查询语法是为编写查询而设计的,而不是一般的monad,因此在此上下文中使用时,语法不是特别有效或优雅。
对monad使用查询语法是一项有点有趣的智力练习,但它根本不太实用。