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

scala – N-Tuple选项的N元组

发布时间:2020-12-16 18:16:53 所属栏目:安全 来源:网络整理
导读:我的直觉告诉我,在一般情况下,没有任何宏观或复杂类型的体操可以解决这个问题. Shapeless或 Scalaz可能会帮助我吗?这是N = 2的问题的特定实例,但我正在寻找的解决方案将适用于所有合理的N值: foo((Some(1),Some("bar"))) == Some((1,"bar"))foo((None,Some
我的直觉告诉我,在一般情况下,没有任何宏观或复杂类型的体操可以解决这个问题. 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更简单.

(编辑:李大同)

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

    推荐文章
      热点阅读