gpt4 book ai didi

f# - F# 中的协程

转载 作者:行者123 更新时间:2023-12-03 21:30:38 25 4
gpt4 key购买 nike

我刚刚开始使用 F# 使用 Unity3D,我注意到 coroutines在书籍和教程中大量使用,作为解决各种问题的巧妙解决方案。我一直试图弄清楚 F# 是否具有等效的内置构造,​​或者是否至少可以以某种方式模仿它们,但我在 MSDN 上找不到任何内容。我只找到了几篇关于使用 Continuation monad 实现协程的文章,但作为初学者,这些都让我难以理解。

这是 Unity 文档中的 C# 示例,当在游戏循环内重复调用时,会导致对象的 alpha 颜色随着时间的推移以小增量淡出:

IEnumerator Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield return;
}

}

所以我只需要声明一个返回 IEnumerator 的函数,然后将控制权交给我想要在体内的任何地方,并带有“yield”。我不确定如何在 F# 中执行此操作,因为我不断收到错误消息“该表达式应具有 IEnumerator 类型,但此处具有类型单元”。 “yield”关键字在 F# 中的行为似乎也有所不同,因为与 C# 不同,它不能单独使用,并且必须在我从文档中理解的序列表达式中。

所以我错过了什么吗?如何在 F# 中实现上述功能?

更新

古斯塔沃的解释是正确的。这是确切的 Unity 脚本,您可以将其附加到对象上,以查看它的红色值在 10 秒的时间范围内减少了 0.1。
namespace CoroutinesExample
open UnityEngine

type CoroutinesExample() =
inherit MonoBehaviour()

member this.Start() =
// Either of the these two calls will work
// this.StartCoroutine("Fade") |> ignore
this.Fade()

member this.Fade() =
seq {
for f in 1.f .. -0.1f .. 0.f do
let mutable c = this.renderer.material.color
c.r <- f
this.renderer.material.color <- c
yield WaitForSeconds(1.f)
} :?> IEnumerator

This article对解释Unity中协程的细节很有帮助。

最佳答案

等效的 F# 代码如下:

member this.Fade() =
seq {
for f in 1.0 .. -0.1 .. 0.0 do
let c = renderer.material.color
c.alpha <- f
renderer.material.color <- c
yield ()
} :> IEnumerable

请注意,与 C# 不同,您必须产生一些值,因此我们使用单位 ( () )。 seq表达式的类型为 seq<unit> ,这是 IEnumerable<Unit> 的别名.为了使它符合 Unity 期望的类型,我们只需要使用 :> IEnumerable 向上转换它。

关于f# - F# 中的协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19810529/

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