2

私は次の方法を持っています:

def lift[P <: Product, L <: HList](params: P)(implicit hl: Generic.Aux[P, L]) = {
  directive[L](_(hl to params))
}

そして、2つ以上の引数を渡すと完全に機能します:

val result  = lift("string", 'a', 10) // compiles
val result2 = list(true, 5) // compiles

しかし、単一の引数を渡すと、暗黙的に解決できません:

val failes = lift("string") 

の一般的な暗黙が見つかりません[String, Nothing]。他の場合に機能するのはなぜですか?

4

1 に答える 1

2

自動タプリングの結果が表示されています。これは、適切な数の値 (この場合は 2 つ) を持つメソッドがない場合にlift(true, 5)解析されるScala の (誤った) 機能です。ただし、コンパイラは単一の値を に自動的にラップしません。コンパイラ エラーが発生するだけです。lift((true, 5))liftTuple1

たとえば、自動タプリングの詳細についてはこの回答を参照してください。自動タプリングは、言語に含めるのがひどいものであるため、いくつかの理由でこのスレッドを参照してください。

考えられる回避策がいくつかあります。最初は、この回答Tuple1で提案されているように、値から への暗黙的な変換を作成することです。個人的には、このアプローチはお勧めしません。コードに導入するすべての暗黙的な変換は、地雷原の別の地雷です。

代わりに、自動タプリングを完全に避けることをお勧めします。明示的に書き出すlist((true, 5))— 数文字余分に追加するだけで、より多くの明瞭さが得られます。残念ながら、 に匹敵するリテラル サポートがないためTuple1、 を書き出す必要がありますがlift(Tuple1("string"))、それでもそれほど悪くはありません。本当に必要な場合は、liftOneそれを行う新しいメソッドを定義することもできます。

于 2014-03-13T17:32:15.867 に答える