gpt4 book ai didi

f# - F# 的 monad 实现在可用关键字数量方面是独一无二的吗?

转载 作者:行者123 更新时间:2023-12-03 20:01:17 25 4
gpt4 key购买 nike

我只知道F#。我还没有学过其他函数式编程语言。我看到的所有关于 monad 的例子都只描述了 bind 和 unit 方法。 F# 有很多关键字(例如 let!do! 等),允许您在同一个计算表达式中执行不同的操作。这似乎比基本的绑定(bind)和单元方法更强大。这是 F# 独有的还是在函数式编程语言中很常见?

最佳答案

是的,我认为计算表达式的 F# 语法是独一无二的,因为它为不同类型的计算提供了直接的语法支持。它可以用于处理 monoids、普通 monads 以及来自 Haskell 的 MonadPlus 计算。

我在 my Master thesis 的介绍中写过这些.我相信它是非常易读的部分,所以你可以去第 27 页阅读它。无论如何,我将在这里复制示例:

Monoid 仅用于使用一些“+”操作(Combine)连接值。例如,您可以使用它来构建字符串(这是低效的,但它展示了这个想法):

type StringMonoid() =
member x.Combine(s1, s2) = String.Concat(s1, s2)
member x.Zero() = ""
member x.Yield(s) = s

let str = new StringMonoid()

let hello = str { yield "Hello "
yield "world!" };;

单子(monad) 是使用计算表达式的绑定(bind)和返回操作的熟悉示例。例如,也许 monad 表示可能在任何时候失败的计算:
type MaybeMonad() =
member x.Bind(m, f) =
match m with Some(v) -> f v | None -> None
member x.Return(v) = Some(v)

let maybe = new MaybeMonad()

let rec productNameByID() = maybe {
let! id = tryReadNumber()
let! prod = db.TryFindProduct(id)
return prod.Name }

加性单子(monad) (又名 MonadPlus 在 Haskell 中)是两者的结合。它有点像可以产生多个值的一元计算。一个常见的例子是列表(或序列),它可以实现绑定(bind)和组合:
type ListMonadPlus() =
member x.Zero() = []
member x.Yield(v) = [v]
member x.Combine(a, b) = a @ b
member x.Bind(l, f) = l |> List.map f |> List.concat

let list = new ListMonadPlus()

let cities = list {
yield "York"
yield "Orleans" }
let moreCities = list {
let! n = cities
yield n
yield "New " + n }

// Creates: [ "York"; "New York"; "Orleans"; "New Orleans" ]

还有一些额外的关键字不直接对应任何理论思想。 use关键字处理资源和 forwhile可以用来实现循环。序列/列表理解实际上使用 for而不是 let! ,因为从句法的角度来看,这更有意义(并且 for 通常需要一些序列 - 尽管它可能是例如异步的)。

关于f# - F# 的 monad 实现在可用关键字数量方面是独一无二的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5996239/

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