gpt4 book ai didi

scala - 将 (A => (M[B], M[C])) 转换为 (A => M[(B, C)])

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

我不知道这方面的技术术语,但正如标题中所述,我正在寻找一个类型类的函数或特性,它将输出一对容器的函数转换为包含一对容器的容器。它的签名应该是这样的

def f[M[_], A, B, C](g: A => (M[B], M[C])): A => M[(B, C)]

要实现这一点,可能需要首先指定一个允许映射的类型类 (M[A], M[B]) => M[(A, B)] 然后组合具有此类型类功能的 g

作为一个具体的例子,假设我们有一个函数f: Int => Option[Int] 和一个函数g: Int => Option[Long]。我们可以使用 scalaz (val h = f &&& g) 中的箭头语法“配对”函数,这样生成的函数 (h) 的类型为 Int = >(选项[Int],选项[Long])。然后,我们可以通过使用 for-comprehension 或与 (a, b) => a tuple b 组合来对 Option 进行排序。这是如何概括的?

编辑:

发布后不久,我发现 scalaz7 中的 tuple 功能来自 Apply 类型类,而不是直接来自 Option。显然,这是一个比 Applicative 更弱的类,这解释了为什么它可以使用 monadic for-comprehension。因此 Apply 应该在一般情况下完成工作。我现在的问题是:如何将原始 A => (M[B], M[C]) 直接转换为 A => M[(B, C)],而不将 Apply 的功能与原始函数的功能组合在一起?

最佳答案

试试这个?我还没有安装 scalaz。

def f[M <: Monad[M[_]], A, B, C](g: A => (M[B], M[C])): A => M[(B, C)] = (a: A) => {
g(a) match {
// For general monads, converts (M[B],M[C]) to M[(B, C)]
case (b, c) => b.map((_, c)).flatMap(k => k._2.map((k._1, _)))
}
}

关于scala - 将 (A => (M[B], M[C])) 转换为 (A => M[(B, C)]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947404/

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