gpt4 book ai didi

scala - mapN 组合应用

转载 作者:行者123 更新时间:2023-12-02 09:08:33 25 4
gpt4 key购买 nike

我知道我可以编写 Apply 来处理嵌套结构,例如

def mapAll[A, B, C, D](o1: List[Option[A]],
o2: List[Option[B]],
o3: List[Option[C]])
(f: (A, B, C) => D)
: List[Option[D]] = {
import cats._
import cats.implicits._
Apply[List].compose[Option].map3(o1, o2, o3)(f)
}

但是,有没有办法说服编译器接受 (o1, o2, o3).mapN(f) 而不是 Apply[List].compose[Option].map3 (o1, o2, o3)(f),以便使用组合的 Apply 应用 mapN

最佳答案

这正是cats.data.Nested的用途:

def mapAll[A, B, C, D](o1: List[Option[A]],
o2: List[Option[B]],
o3: List[Option[C]])
(f: (A, B, C) => D)
: List[Option[D]] = {
import cats.data.Nested
import cats.instances.list._, cats.instances.option._
import cats.syntax.apply._

(Nested(o1), Nested(o2), Nested(o3)).mapN(f).value
}

(请注意,您需要启用 -Ypartial-unification 编译器标志才能编译上面的代码。或者您可以添加一些类型参数,但我突然想到不确定到底在哪里需要它们,而且如果您要使用 Cats 做任何事情,无论如何,-Ypartial-unification 都是非常必要的。)

您还可以使组合实例隐式可用:

import cats.Apply
import cats.instances.list._, cats.instances.option._
import cats.syntax.apply._

type ListOption[x] = List[Option[x]]

implicit val listOptionApply: Apply[ListOption] = Apply[List].compose[Option]

def mapAll[A, B, C, D](o1: ListOption[A],
o2: ListOption[B],
o3: ListOption[C])
(f: (A, B, C) => D)
: List[Option[D]] = (o1, o2, o3).mapN(f)

但这确实并不理想——它是非标准的并且极其脆弱(例如,类型别名是指导解析所必需的)。

在我看来,你最好的选择就是明确地写出 Apply[List].compose[Option] 并跳过花哨的元组语法,但如果你真的必须拥有花哨的元组语法,使用嵌套

关于scala - mapN 组合应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55199931/

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