gpt4 book ai didi

Scala Function.tupled 与 f.tupled

转载 作者:行者123 更新时间:2023-12-04 21:13:16 27 4
gpt4 key购买 nike

我有以下 Scala 代码:

def f(x: Int, y: Int): Option[String] = x*y match {
case 0 => None
case n => Some(n.toString)
}

val data = List((0, 1), (1, 0), (2, 3), (4, -1))

data flatMap {case (x, y) => f(x, y)}

但是,最后一行太冗长了,所以我尝试了所有这些,但都没有编译。
data flatMap f data flatMap f.tupled data flatMap Function.tupled(f) data flatMap {f _} data flatMap (f _).tupled data flatMap f(_)
我究竟做错了什么?唯一有效的是:
(data map Function.tupled(f)).flatten
我以为是 map其次是 flatten始终可以替换为 flatMap ,但虽然上面的行编译,这不会:
data flatMap Function.tupled(f)

最佳答案

您只能使用 flatMap返回时Options因为存在来自 Option 的隐式转换至 Iterable由隐式option2Iterable .方法flatMap在您的 List[(Int, Int)]期望来自 (Int, Int) 的函数至 GenTraversableOnce[Int] .编译器无法将隐式转换识别为此处的可行选项。您可以通过显式指定泛型参数来帮助编译器:

import Function._
data.flatMap[String, Iterable[String]](tupled(f))
//Or
data flatMap tupled[Int, Int, Iterable[String]](f)

相同想法的其他公式也可能允许编译器选择正确的类型和隐式,即使没有显式泛型:
data flatMap (tupled(f _)(_))
data.flatMap (f.tupled(f _)(_))

最后,您可能还想玩 collect连同 unlift在这里,这也可以是表达此逻辑的好方法:
data collect unlift((f _).tupled)
data collect unlift(tupled(f))
Function.unlift采用一个返回 Option 的方法并把它变成 PartialFunction与原始函数返回的位置不匹配 None . collect如果在每个元素上定义了偏函数,则采用偏函数并收集偏函数的值。

关于Scala Function.tupled 与 f.tupled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29956771/

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