3

JodaTime を使用して、List[LocalDate] を Tuple2[JodaTime, JodaTime] に変換しようとしているので、次のように複数の割り当てを行うことができます。

val(expire, now) = 
  List(row.expireDate, new JodaDate) zip (_.toDateTimeAtStartOfDay.getMillis)

もちろん、これはコンパイルされません。上記を行うための同様の簡潔な方法はありますか? 手動でできることはわかっています:

val(expire, now) = 
  (row.expireDate.toDateTimeAtStartOfDay.getMillis, 
   new JodaDate().toDateTimeAtStartOfDay.getMillis)

しかし、それは少し醜いです

4

4 に答える 4

10
val Seq(expire, now) = 
  Seq(row.expireDate, new JodaDate).map(_.toDateTimeAtStartOfDay.getMillis)
于 2012-07-06T14:06:56.767 に答える
4

あなたが望むもの (conversion-to-route に行きたくないという前提でSeq) は、 Scalaz のタプルのBifunctorインスタンス(標準ライブラリにはありません) です。それを使用すると、次のように記述できます。

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

scala> val cap = (_: String).toUpperCase
cap: String => java.lang.String = <function1>

scala> val removeLs = (_: String).replaceAll("l", "")
removeLs: String => java.lang.String = <function1>

scala> cap <-: ("hello", "world") :-> removeLs
res0: (java.lang.String, java.lang.String) = (HELLO,word)

または、あなたの場合:

val f = (_: JodaDate).toDateTimeAtStartOfDay.getMillis
val (expire, now) = f <-: (row.expireDate, new JodaDate) :-> f
于 2012-07-06T14:08:35.150 に答える
2
val Seq(a, b) =
  Seq("a", "b").map(_.toUpperCase)

println("a, b = %s, %s".format(a, b)) // a, b = A, B
于 2012-07-06T14:07:48.443 に答える
1

タプルを使用する際のタイプ セーフを維持したい場合 (a を unapply するときSeq、コンパイラは長さをチェックしないことに注意してください)、ラッパーを記述して、標準ライブラリでは利用できない関数を追加することができます。タプル。

単一の関数を使用して両方の要素をマッピングする場合、 a には 2 つの型パラメーターがあるため、これを機能させるための鍵は、とが同じ型であるTuple2[A, B]という証拠を要求することです。これを行うには、 type の暗黙的なパラメーターが必要です。型が実際に等しい場合、コンパイラは type の関数を提供します。ABB =:= AB => A

class Tuple2Wrapper[A, B](t: (A, B)) {
  def bimap[C, D](f: A => C, g: B => D): (C, D) = (f(t._1), g(t._2))
  def <-:->[C](f: A => C)(implicit ev: B =:= A): (C, C) = bimap(f, f compose ev)
}

implicit def tuple2Tuple2Wrapper[A, B](t: (A, B)) = new Tuple2Wrapper(t)

scala> (1, 1) <-:-> (_ + 1)
res1: (Int, Int) = (2,2)

Tuple2これは、Scalaz のBifunctortraitの観点から実装されている場合、より一般的で便利な方法 ( だけでなく、より多くの型に適用可能) で行うことができます。

于 2012-07-06T15:50:53.207 に答える