scala – 我可以用Shapeless解决它吗?
发布时间:2020-12-16 18:56:23 所属栏目:安全 来源:网络整理
导读:假设我有一些功能: val f1: Int = Stringval f2: (Int,Int) = Stringval f3: (Int,Int,Int) = Stringdef fromList1(f: Int = String): List[Int] = Option[String] = _ match {case x::_ = Some(f(x)); case _ = None}def fromList2(f: (Int,Int) = String)
假设我有一些功能:
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) 我可以用无形的方式做到吗? 解决方法
这可能有所帮助:
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是构造函数(由宏生成),它从结点F,hlist类型HList和结果类型R创建FnToProduct.所有这些都是从您传递的f参数推断出来的. 最后一个,如果可能,toHList从常规List创建Some(HList),否则为None.它使用FromTraversable [L]隐式来做到这一点,其中L已经从f推断出来. Shapeless2足够智能识别来自元组的HList(因为可能存在隐式转换). 例: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |