2016-09-02 11 views
2

シェイプレス(2.3.2)を習得しようとしています。シェーピングレス拡張可能レコードのAPI

could not find implicit value for parameter updater: shapeless.ops.record.Updater[L,T with shapeless.labelled.KeyTag[k.type,T]] 
:私のattempsのすべてが同様のコンパイルエラーで終了し

def upsert[T](k: String, v: T) = ??? 

case class Records[L <: HList](ps: L) { 

    def get(k: Witness)(implicit selector: Selector[L, k.T]): selector.Out = selector(ps) 

    def rm[V, Out <: HList](k: Witness)(implicit remover: Remover.Aux[L, k.T, (V, Out)]) = 
    this.copy(ps = remover(ps)._2) 

    def upd[F](f: F)(implicit updater: Updater[L, F]) = this.copy(ps = updater(ps, f)) 
} 

は今、私のようなAPIメソッドを実現しようとしている:私は、拡張可能な記録のために非常に単純なコンテナを作成しました

このようなAPIを構築する方法(形容詞に固執されない)と、そのような問題を解決するための情報を収集する方法を教えてください。

+0

それがうまくいくかどうかはわかりませんが、Updaterで行ったようにUpdater型の暗黙的なパラメータを 'upsert'に追加してください。これは一般的なルールです。暗黙的な値を求める場合は、それを暗黙のパラメータとして関連する関数に追加してみてください。 – Haspemulator

+0

それは動作します!ありがとう – hellraiser

答えて

2

私は考えましたが、私はそれが受け入れられるように私のコメントを答えにしたいと思います。

暗黙的な値の欠落についてコンパイラが不平を言うと、私の経験では、最初に行うことは暗黙のパラメータを介して関連する関数にそれを提供することです。シェイプレスはそのような暗黙のものをたくさん提供します。暗黙的なパラメータを追加することによって、そのようなエラーを修正する可能性が非常に高いです。

Updater(型パラメータについてはわかりませんが、の暗黙のパラメータと一致する必要があります)のupsert関数を追加します。

関連する問題