scala – N-Tuple选项的N元组
我的直觉告诉我,在一般情况下,没有任何宏观或复杂类型的体操可以解决这个问题. Shapeless或
Scalaz可能会帮助我吗?这是N = 2的问题的特定实例,但我正在寻找的解决方案将适用于所有合理的N值:
foo((Some(1),Some("bar"))) == Some((1,"bar")) foo((None,Some("bar"))) == None foo((Some(1),None)) == None 同样,这不是this question的重复,因为我正在寻找N-Tuples的一般解决方案.提出的答案专门针对2元组. 我是不是写了一个宏,还是可以将Shapeless / Scalaz保存一天? 解决方法
shapeless-contrib让这很容易:
import shapeless._,ops.hlist.Tupler,contrib.scalaz._,scalaz._,Scalaz._ def foo[T,L <: HList,O <: HList](t: T)(implicit gen: Generic.Aux[T,L],seq: Sequencer.Aux[L,Option[O]],tup: Tupler[O] ): Option[tup.Out] = seq(gen.to(t)).map(tup(_)) 这需要将参数中的元素静态输入为Option: scala> foo((some(1),some("bar"))) res0: Option[(Int,String)] = Some((1,bar)) scala> foo((none[Int],some("bar"))) res1: Option[(Int,String)] = None scala> foo((some(1),none[String])) res2: Option[(Int,String)] = None 正如Alexandre Archambault在Gitter上所提到的那样,我也可以编写一个type-level version(或者更确切地说是一个更类型级别的版本),你可以使用静态类型为Some或None的元素来获取一个元组,并获得一个静态的结果键入为Some或None.这可能在某些情况下有应用程序,但一般情况下,如果你有一些静态输入的东西[Some],你应该把它表示为A,我猜你可能想要较少的类型级版本. 请注意,shapeless-contrib的Sequencer适用于任何应用程序仿函数,而不仅仅是Option,这意味着您可以很容易地重写我的foo以获取F [_]:Applicative类型参数并返回F [T].您也可以使用自己的不太通用的版本,只能使用Option,并且实现可能比shapeless-contrib更简单. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |