は私が期待どおりに動作し、次があります。型崩れ:fooのUnaryTCConstraint [T、U]
import shapeless._
import shapeless.UnaryTCConstraint._
import shapeless.test.illTyped
case class Foo[R](result: R, dependencies: Set[Foo[_]] = Set.empty)
//This method only accepts an HList of Foo
def method[L <: HList](list: L)(implicit utcc: UnaryTCConstraint[L, Foo]) = println("checks")
val notFoos = "abc" :: 1 :: 5.5 :: HNil
illTyped { """method(notFoos)""" }
val aFoo = Foo("abc")
val bFoo = Foo(2, Set(aFoo))
val cFoo = Foo(true, Set(bFoo))
val onlyFoos = aFoo :: bFoo :: cFoo :: HNil
method(onlyFoos) // prints checks
いくつかのリファクタリング後、私は依存関係がFOOSのHListべきであるという結論に達しましたしました。
val aFoo = Foo("abc")
私はこのエラーを取得する:
Could not find implicit value for parameter utcc: shapeless.UnaryTCConstraint[shapeless.HNil.type,FooWithAnyDependency]
Error occurred in an application involving default arguments.
val aFoo = Foo("abc")
^
私はので、その失敗を考えて、私はそれを使用しようとすると、しかし、このコードはコンパイル
type FooWithAnyDependency[R] = Foo[R, _ <: HList]
case class Foo[R, L <: HList](result: R, dependencies: L = HNil)(implicit utcc: UnaryTCConstraint[L, FooWithAnyDependency])
def method2[L <: HList](list: L)(implicit utcc: UnaryTCConstraint[L, FooWithAnyDependency]) = println("checks")
:だから私はにコードを変更しましたUnaryTCConstraint [HNil .type、FooWithAnyDependency]を検索しようとしています。
カスタム制約を実装することで問題は解決することが分かりましたが(すでにこれを行っています)、他のものを使用しようとすると同じ問題が発生します。たとえば、Comapped.Aux[L, FooWithAnyDependency, M]
です。
Fooのためにほとんどのものを再実装する必要なく、この問題をどのように克服できますか。
これは 'val aFoo = Foo(" abc ")'しかし、この 'val bFoo = Foo(5、aFoo :: HNil)'は動作しません。エラー: 'utcc:shapeless.UnaryTCConstraint [shapeless。:: [Foo [String、HNil]、HNil]、FooWithAnyDependency]'の暗黙の値を見つけることができませんでした。なぜ私は理解できません。 –
@SimãoMartins統一の問題のように見えます。私は制約を取り込むために独自の型クラスを書くことをお勧めします。 –