gpt4 book ai didi

scala - 有没有办法展平不同类型的嵌套 monad?

转载 作者:行者123 更新时间:2023-12-04 02:12:24 24 4
gpt4 key购买 nike

我不知道如何描述这个问题,所以我只会显示类型签名。

我有以下实例:

val x:Future[F[Future[F[B]]]] = ???

我想要一个实例:
val y:Future[F[B]] = ???
F是一个 Monad,所以我有以下方法:
def pure[A](a:A):F[A] = ???
def flatMap[A, B](fa:F[A], f:A => F[B]):F[B] = ???
def map[A, B](fa:F[A], f:A => B):F[B] = flatMap(fa, (a:A) => pure(f(a)))

我认为以下应该有效,但感觉不对:
x.flatMap { fWithFuture =>
val p = Promise[F[B]]
flatMap(fWithFuture, (futureF: Future[F[B]]) => {
p.completeWith(futureF)
pure(())
})
p.future
}

有没有我缺少的概念?

一些背景信息。我正在尝试定义这样的函数:
def flatMap[A, B](fa:Future[F[A]], f: A => Future[F[B]]):Future[F[B]] = ???

也许这在概念上是一件奇怪的事情。欢迎任何关于有用抽象的提示。

最佳答案

正如上面 Rex Kerr 所指出的,您经常可以使用 monad 转换器来处理您发现自己有这样的交替层的情况。例如,如果 F这是Option ,您可以使用 Scalaz 7.1OptionT monad 变压器来写你的 flatMap :

import scalaz._, Scalaz._

type F[A] = Option[A]

def flatMap[A, B](fa: Future[F[A]], f: A => Future[F[B]]): Future[F[B]] =
OptionT(fa).flatMap(f andThen OptionT.apply).run
OptionT[Future, A]这是 Future[Option[A]] 的一种包装器.如果您的 FList , 只需替换 OptionTListTrununderlying (等等)。

好消息是,当您使用 OptionT[Future, A] 时,例如,您通常可以避免以 Future[Option[Future[Option[A]]]] 结尾首先——见我的回答 here一些更详细的讨论。

一个缺点是并非所有 monad 都有转换器。例如,您可以输入 Future在堆栈的底部(正如我在上面所做的那样),但实际上并没有真正有用的方法来定义 FutureT .

关于scala - 有没有办法展平不同类型的嵌套 monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24875258/

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