几天前,我一直在#haskell IRC 房间里闲逛,有人提到 C# 具有执行单子理解的语法。这是什么意思?
如果我理解正确,单子理解只是一种排序bind
操作的方式,哪种听起来像do
符号?那是对的吗?
问题是我在 C# 中看不到这一点。据我所知IEnumerable<T>
是一个单子,SelectMany
它的bind
功能在哪里,因为它的签名是A -> IEnumerable<B>
. 有了一点想象力,我们可以做到
from x in xs
from y in ys
这转化为(我在这里不是 100% 确定)
xs.SelectMany(x => ys.Select(y => y), (x, y) => ...)
但即使这是真的并且我们认为 LINQ 是一种 monad 理解语法,它仍然只适用于IEnumerable<T>
. 我们在 C# 中确实有其他 monad,例如Task<T>
,但是我们如何在这些 monad 上使用 LINQ?
这个问题中的许多假设可能是完全错误的,因为我仍在尝试掌握一些单子魔法的东西。如果我错了,请纠正我:)