gpt4 book ai didi

scala - 我可以用 Shapeless 解决它吗?

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

假设我有几个功能:

val f1: Int => String
val f2: (Int, Int) => String
val f3: (Int, Int, Int) => String

def fromList1(f: Int => String): List[Int] => Option[String] =
_ match {case x::_ => Some(f(x)); case _ => None}

def fromList2(f: (Int, Int) => String): List[Int] => Option[String] =
_ match {case x::y::_ => Some(f(x, y)); case _ => None}

现在我想写一个通用的 fromList工作如下:
val g1: List[Int] => String = fromList(f1) // as fromList1(f1)
val g2: List[Int] => String = fromList(f2) // as fromList2(f2)

我可以用 shapeless 做到这一点吗? ?

最佳答案

这可能有帮助:

import shapeless._
import syntax.std.traversable._
import shapeless.ops.traversable._
import syntax.std.function._
import ops.function._

def fromList[F, L <: HList, R](f: F)
(implicit fp: FnToProduct.Aux[F, L => R], tr: FromTraversable[L]) =
(p: List[Int]) => p.toHList[L] map f.toProduct
f.toProduct将常规函数转换为需要 HList 的函数作为参数 - 它需要 FnToProduct隐含的,实际上只是调用它。 FnToProduct.Aux是创建 FnToProduct 的构造函数(由宏生成)来自 dunction F , hlist 类型 HList和结果类型 R .所有这些都是从 f推断出来的。你传递的参数。

最后一位, toHList创建 Some(HList)来自常规 List如果可能,否则 - None .它使用 FromTraversable[L]隐式这样做,其中 L已经从 f 推断出来. Shapeless2 足够聪明,可以识别 HList来自 Tuple (因为可能存在隐式转换)。

例子:
scala> val f1: Int => String = _ => "a"
f1: Int => String = <function1>

scala> val f2: (Int, Int) => String = (_, _) => "a"
f2: (Int, Int) => String = <function2>

scala> val g1 = fromList(f1)
g1: List[Int] => Option[String] = <function1>

scala> g1(List(1))
res6: Option[String] = Some(a)

scala> val g2 = fromList(f2)
g2: List[Int] => Option[String] = <function1>

scala> g2(List(1, 2))
res7: Option[String] = Some(a)

scala> g2(List(1))
res8: Option[String] = None

关于scala - 我可以用 Shapeless 解决它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071569/

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