2016-11-13 4 views
3

반올림 (상수 값 반환) 태그가있는 HList (레코드)를 매핑하려고 시도하고 있습니다. value, polymorphic argument type)은 해당 함수의 적절한 인수 유형으로 구성된 레코드에 대해 기능합니다. 저는 ZipApply에 대해 알고 있는데, HLists에서 작동하는 것처럼 보입니다.하지만 순서에 관계없이이 작업을 구체적으로 수행하고 키 유형을 사용하여 사용할 함수를 선택하려고합니다.함수의 태그가있는 HList (레코드)를 인수 형식의 레코드를 통해 매핑합니다.

가 여기에 내가 알아낼 수 없습니다 이유로 컴파일되지 않은 내 코드의 예입니다 :

import shapeless._ 
import labelled._ 
import ops.hlist._ 
import ops.record.Selector 
import syntax._ 
import syntax.singleton._ 
import syntax.HListOps 

object POC { 
    case class Foo(bar: String) 
    val gen = LabelledGeneric[Foo] 
    val funs = ('bar ->> { s: String => s.toUpperCase() }) :: HNil 

    val poly = new Poly1 { 
    implicit def apply[K, V] 
    (implicit selector: Selector.Aux[funs.type, K, (V) => String]) = 
     at[FieldType[K, V]] { v => selector(funs)(v) } 
    } 

    def run(foo: Foo)(implicit mapper: Mapper[poly.type, gen.Repr]) = 
    mapper(gen to foo) 

    println(run(Foo("bar"))) 
    // could not find implicit value for parameter mapper: shapeless.ops.hlist.Mapper[POC.<refinement>.type,POC.gen.Repr] 
} 
+0

어떤 셰이프 버전을 사용하고 있습니까? – laughedelic

+0

@laughedelic 2.3.2 – glittershark

답변

2

여기서 문제는, poly 안정적인 식별자가 아니거나 충분히 안정적이지 점이다 또는 그런 식으로. 다음은 잘 작동합니다

object poly extends Poly1 { ... } 

나는 (지금은 4.5 세입니다) this answer of mine에 마일의 의견보다 여기에 무슨 일이 일어나고 있는지의 더 나은 설명을 본 적이 모르겠어요.

+2

scala is weird ... – glittershark

+0

Daniel Spiewak이이 문제에 대한이 정당한 근거를 제시했다고 생각합니다. https://vimeo.com/165837504 (약 28 분). 간단히 말해서, 이러한 implicits는 companion 객체에 정의되어야합니다. 그렇지 않으면 컴파일러에서 찾을 수 없습니다. –