2

に変換することは可能(Option[Int], Option[String])です(FirstOption[Int], FirstOption[String])か? より短い方法でx=> (x._1.first, x._2.first)

これを行う方法があるはずですが、見つけることができませんでした。

4

1 に答える 1

4

1つの方法は、Bifunctorインスタンスを使用することです。

scala> val t = (Option(1), Option("str"))
t: (Option[Int], Option[java.lang.String]) = (Some(1),Some(str))

scala> import scalaz._, Scalaz._, Tags._
import scalaz._
import Scalaz._
import Tags._

scala> t.bimap(First, First)
res0: (scalaz.package.@@[Option[Int],scalaz.Tags.First], scalaz.package.@@[Option[java.lang.String],scalaz.Tags.First]) = (Some(1),Some(str))

より慣用的な方法(わかりました、より一般的な方法:任意のタプル、トリプルなどで機能します)は、おそらくシェイプレスを使用てタプルをにHList変換し、自然変換を適用しますOption[A] ~> Option[A] @@ First。これの大ざっぱな実装は次のとおりです。

scala> import scalaz._, Scalaz._, Tags._
import scalaz._
import Scalaz._
import Tags._

scala> import shapeless._, Tuples._, Nat._
import shapeless._
import Tuples._
import Nat._

scala> val t = (Option(1), Option("str"))
t: (Option[Int], Option[String]) = (Some(1),Some(str))

scala> object optionToFirstoption extends (Option ~> FirstOption) {
     |   def apply[A](fa: Option[A]): Option[A] @@ First = First(fa)
     | }
defined module optionToFirstoption

scala> t.hlisted.map(optionToFirstoption).tupled
res1: (Option[Int] with scalaz.Tagged[scalaz.Tags.First], Option[String] with scalaz.Tagged[scalaz.Tags.First]) = (Some(1),Some(str))
于 2013-03-22T11:35:50.743 に答える