2017-12-07 19 views
1

最近シェイプレスで遊んでいます。私の周り私の頭をラップすることはできません。この非常に基本的な事があります:シェイプレスzipWithKeys:暗黙のパラメータを見つけることができませんでした

import shapeless._ 
import syntax.singleton._ 
import record._ 

object NotWorking { 
    val result = ("value" :: HNil).zipWithKeys("key" :: HNil) 
} 

私は出力に拡張可能なレコードのこのスニペットを期待しています。しかし、コンパイラはwithKeysのための暗黙のを見つけることができません:

could not find implicit value for parameter withKeys: shapeless.ops.hlist.ZipWithKeys[shapeless.::[String,shapeless.HNil],shapeless.::[String,shapeless.HNil]] 
[error]  ("value" :: HNil).zipWithKeys("key" :: HNil) 

それがさらに混乱、私はフォーム型崩れのテストケースを取った例としてですが完璧に動作します:私は何をしないのです

import shapeless._ 
import syntax.singleton._ 
import record._ 

object ShamelesslyStolenFromTests { 
    val orig = 
    ("intField" ->> 1) :: 
    ("boolField" ->> true) :: 
    HNil 

    val result = orig.values.zipWithKeys(orig.keys) 
} 

+0

あなたの輸入品は? –

+0

こんにちは@GáborBakos、更新された質問を参照してください:) – Roman

答えて

2

次のコードはコンパイルされます。

import shapeless._ 
    import syntax.singleton._ 
    import record._ 

    object FinallyWorking { 
    val result = ("value" :: HNil).zipWithKeys[Witness.`"key"`.T :: HNil]("key".narrow :: HNil) 
    } 

だから、これはメソッドの型パラメータの型推論の問題だったようです。

+0

あなたの答えに多くの感謝! 'zipWithKeys'が本当にそのように使われることを意図しているかどうか知っていますか?もっと簡単なアプローチが必要なような気がします。これはシェイプレスのバグでしょうか? – Roman

+0

これは間違いなくシェイプレスのバグではありません。これは、コンパイラが使用する型推論のアルゴリズムの制限です。 'zipWithKeys'のオーバーロードされたバージョンを使うことができます:' '(" value ":: HNil).zipWithKeys [Witness.'" key "' .T :: HNil] ''。これにより、コードの重複を避けることができます。この 'zipWithKeys'は、型と値の両方のレベルで動作する最初の' zipWithKeys'ではなく、型レベルで機能します。 –

+1

それは意味をなさない。どうも! 'val result =(" value ":: HNil).zipWithKeys [HList。\' "key" \ '.T]'はさらに簡潔です。 – Roman

関連する問題