【发布时间】:2013-11-11 15:48:13
【问题描述】:
几天前我一直在#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 是一种单子解析语法,它仍然只适用于IEnumerable<T>。我们在 C# 中确实有其他单子,例如 Task<T>,但我们如何在这些单子上使用 LINQ?
这个问题中的许多假设可能是完全错误的,因为我仍在尝试掌握一些单子魔法的东西。如果我错了,请纠正我:)
【问题讨论】:
标签: c# haskell functional-programming monads