2016-11-13 4 views
3

Ich bin (in der Tat, das ist alles vereinfacht von meinem Arbeitsbeispiel) versuchen, eine markierte HList (ein Datensatz) von kontravariant (konstante Rückkehr Wert, polymorpher Argumenttyp) funktioniert über einen Datensatz, der aus den richtigen Argumenttypen dieser Funktionen besteht. Ich bin mir bewusst, ZipApply, und das scheint für HLists zu arbeiten, aber ich möchte dies speziell unabhängig von der Reihenfolge und insbesondere die Schlüsseltypen verwenden, um auszuwählen, welche Funktionen zu verwenden.Ordnen Sie eine markierte HList (Datensatz) von Funktionen über einen Datensatz ihrer Argumenttypen

Hier ist mein Codebeispiel, das nicht aus Gründen kompiliert ich kann nicht herausfinden:

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

Welche Version von Shapeless verwenden Sie? – laughedelic

+0

@laughedelic 2.3.2 – glittershark

Antwort

2

Das hier Problem ist, dass poly keine stabile Kennung ist, oder es ist nicht stabil genug, oder so ähnlich. Im Folgenden wird gut funktionieren:

object poly extends Poly1 { ... } 

Ich bin nicht sicher, ich eine viel bessere Erklärung gesehen habe, was hier vor sich geht, als Miles Kommentar auf this answer of mine (die jetzt viereinhalb Jahre alt ist).

+2

scala ist seltsam ... – glittershark

+0

Ich denke, Daniel Spiewak gab eine faire Rechtfertigung dieses Verhaltens in diesem Vortrag: https://vimeo.com/165837504 (um 28 '). Kurz gesagt, diese Implizite müssen in einem Companion-Objekt definiert werden, ansonsten werden sie vom Compiler nicht gefunden. –

Verwandte Themen