gpt4 book ai didi

c# - LINQ 相当于 f# 的 builder.Zero()?

转载 作者:太空狗 更新时间:2023-10-30 00:09:58 31 4
gpt4 key购买 nike

因此,我对 f# 的计算表达式和自定义构建器非常上瘾。我必须在大部分日常工作中使用 c#,但仍想将 LINQ 表达式与我自己的 monads/monoids 一起使用。有人知道是否有与 f# 的 Zero 方法类似的 c# 吗?

Relevant f# docs

这是我在 f# 中所做的:

type OptionBuilder() =
member x.Bind(v,f) = Option.bind f v
member x.Return v = Some v
member x.ReturnFrom o = o
member x.Zero() = Option.None

let option = OptionBuilder()

// Example usage (I want something similar from c#)

let t : Option<int> =
option { if false then return 5 }

最佳答案

我不确定你在这里问的到底是什么,但我会试一试。考虑澄清问题。

在 C# 中,与单子(monad)工作流中没有 elseif 等效的是:

from a in b
where c(a)
select a

逻辑上这等同于(使用您的绑定(bind)、返回和零)

Bind(b, a => c(a) ? Return(a) : Zero)

但 C# 不会将 where 子句降级为 SelectMany(这是 C# 所称的 Bind)。 C# 将查询理解中的 Where 子句降低为对

的调用
Where(M<T>, Func<T, bool>)

简而言之:C# 具有查询理解形式的任意单子(monad)工作流;任何具有 Select、SelectMany、Where 等方法的单子(monad)类型都可以在理解中使用。但它并没有真正推广到具有显式零的加法单子(monad)。相反,“Where”应该具有我上面提到的绑定(bind)操作的语义:如果项目匹配谓词,它应该与将单个值绑定(bind)到末尾具有相同的效果,否则绑定(bind)零值。

显然,序列的“Where”就是这样做的。如果你有 [a, b, c] 并想过滤掉 b,这与将 [[a]、[]、[c]] 连接在一起是一样的。但是,当然,实际构建和连接所有这些小序列的效率会非常低。 效果肯定是一样的,但是实际操作起来效率会高很多。

C# 实际上是为支持非常具体的 monad 而设计的:通过 yield 和查询理解的序列 monad,通过 await 的延续 comonad,等等。我们并未将其设计为启用您在 Haskell 中看到的任意单子(monad)工作流。

这是否回答了您的问题?

关于c# - LINQ 相当于 f# 的 builder.Zero()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41193857/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com