我的直觉告诉我,在一般情况下,没有任何宏观或复杂类型的体操可以解决这个问题. 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更简单.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。