2016-10-02 4 views
2

は私が期待どおりに動作し、次があります。型崩れ: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のためにほとんどのものを再実装する必要なく、この問題をどのように克服できますか。

答えて

2

あなたは、推論されたHNil.typeシングルトンタイプの問題が正しいと思います。幸いな修正が非常にある簡単な-あなただけHNilのために型注釈を提供します。一般的には

case class Foo[R, L <: HList](
    result: R, 
    dependencies: L = HNil: HNil 
)(implicit utcc: UnaryTCConstraint[L, FooWithAnyDependency]) 

を型崩れを取り扱う際には、(多かれ少なかれ役に立たないを避けるために、HNilため、このようなタイプの注釈を提供する必要がありますHNilはトンを確保::方法を持っているという理由だけで推測されたタイプInt :: HNilの代わりInt :: HNil.typeを持つことになります

val hlist = 1 :: HNil 

:あなたはこのような何かを書くときを除く)シングルトンタイプHNil.type、帽子あなたは正しいタイプを得る。

+0

これは 'val aFoo = Foo(" abc ")'しかし、この 'val bFoo = Foo(5、aFoo :: HNil)'は動作しません。エラー: 'utcc:shapeless.UnaryTCConstraint [shapeless。:: [Foo [String、HNil]、HNil]、FooWithAnyDependency]'の暗黙の値を見つけることができませんでした。なぜ私は理解できません。 –

+1

@SimãoMartins統一の問題のように見えます。私は制約を取り込むために独自の型クラスを書くことをお勧めします。 –

関連する問題