gpt4 book ai didi

scala - 如果 A 和 B 是单子(monad),如何将 A[B[C]] 转换为 B[A[C]]?

转载 作者:行者123 更新时间:2023-12-04 00:56:46 25 4
gpt4 key购买 nike

我正在寻找一个更通用的解决方案,它利用单子(monad)(可能还有单子(monad))来实现与if( xs.contains(None) ) None else Some(xs.flatten)xs 做类型 Seq[Option[A]] .

我怎么能用 Scalaz 做到这一点?我觉得我错过了一些明显的东西。

最佳答案

拥有两个 monad 既不够(对于 M )又绰绰有余(对于 N )——当然,这加起来还不够——但是如果 M有一个 Traverse实例和 N有一个 Applicative例如,您可以使用 sequence .例如:

import scalaz._, Scalaz._

def foo[A](xs: List[Option[A]]): Option[List[A]] = xs.sequence

这具有您想要的语义。请注意,我使用的是 List而不是 Seq ,因为 Scalaz 7 不再提供必要的 Traverse Seq 的实例(尽管您可以轻松编写自己的)。

如您所见,以下内容无法编译:
List(Some(1), Some(45)).sequence

虽然抛出 None 也没关系在那里:
scala> List(Some(1), None, Some(45)).sequence
res0: Option[List[Int]] = None

这是因为 List(Some(1), Some(45)) 的推断类型将是 List[Some[Int]] ,我们没有 Applicative Some 的实例.

Scalaz 提供了一个方便的 some类似于 Some.apply 的方法但给你一些已经输入为 Option的东西,因此您可以编写以下内容:
scala> List(some(1), some(45)).sequence
res1: Option[List[Int]] = Some(List(1, 45))

无需额外输入。

关于scala - 如果 A 和 B 是单子(monad),如何将 A[B[C]] 转换为 B[A[C]]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358673/

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