加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读