2

case を shapeless variable と一致させるにはどうすればよいですか?

次のタイプの変数があるとしましょうshapeless.::[String,shapeless.::[String,shapeless.HNil]]

現在、私はこれをしなければなりません

authHeaders.hrequire(shape_value => {
    val (client_id, client_secret) = value.tupled
    isAuthorized(client_id, client_secret)
  }
  )

String :: String :: HNil別のステートメントで行う必要がないように、どういうわけか文字列ペアに巻き戻すことはできますか?

4

1 に答える 1

4

unapplyオブジェクトにメソッドがありますshapeless.::

def unapply[H, T <: HList](x: H :: T): Option[(H, T)]

したがって、次のように一致させることができますHList

scala> val ::(a, ::(b, HNil)) = "1" :: "x" :: HNil
a: String = 1
b: String = x

または、次の代わりに結果: を使用するunapplyメソッドの代替構文を使用:Tuple2a :: b::(a, b)

scala> val a :: b :: HNil = "1" :: "x" :: HNil
a: String = 1
b: String = x

scala> "1" :: "x" :: HNil match {
     |   case a :: b :: HNil => s"$a :: $b :: HNil"
     | }
res0: String = 1 :: x :: HNil

あなたの場合:

authHeaders.hrequire{
  case client_id :: client_secret :: HNil => isAuthorized(client_id, client_secret)
}

メソッドを使用tupledして、N 引数の関数を単一TupleN引数の関数に変換できます。

関数の場合:

val isAuthorized: (String, String) => Boolean = ???
authHeaders.hrequire{ isAuthorized tupled _.tupled }

メソッドの場合:

def isAuthorized(s1: String, s2: String): Boolean = ???
authHeaders.hrequire{ (isAuthorized _) tupled _.tupled }
于 2013-07-24T05:47:14.747 に答える