2017-12-07 5 views
1

nicht finden Ich habe vor kurzem mit formlos gespielt. Es gibt dieses sehr grundlegende Ding, das ich meinen Kopf nicht einwickeln kann:Shapeless zipWithKeys: Konnte den impliziten Parameter

import shapeless._ 
import syntax.singleton._ 
import record._ 

object NotWorking { 
    val result = ("value" :: HNil).zipWithKeys("key" :: HNil) 
} 

Ich erwarte dieses Schnipsel, um einen ausdehnbaren Rekord auszugeben. Aber der Compiler ist nicht in der Lage eine implizite für withKeys zu finden:

could not find implicit value for parameter withKeys: shapeless.ops.hlist.ZipWithKeys[shapeless.::[String,shapeless.HNil],shapeless.::[String,shapeless.HNil]] 
[error]  ("value" :: HNil).zipWithKeys("key" :: HNil) 

Es ist noch verwirrender, wie das Beispiel I Form von Testfällen Shapeless nahm funktioniert perfekt:

import shapeless._ 
import syntax.singleton._ 
import record._ 

object ShamelesslyStolenFromTests { 
    val orig = 
    ("intField" ->> 1) :: 
    ("boolField" ->> true) :: 
    HNil 

    val result = orig.values.zipWithKeys(orig.keys) 
} 

Was bin ich?

+0

Was sind Ihre Importe? –

+0

Hallo @ GáborBakos, siehe aktualisierte Frage :) – Roman

Antwort

2

Der folgende Code kompiliert:

import shapeless._ 
    import syntax.singleton._ 
    import record._ 

    object FinallyWorking { 
    val result = ("value" :: HNil).zipWithKeys[Witness.`"key"`.T :: HNil]("key".narrow :: HNil) 
    } 

So ist es das scheint ein Problem mit Typinferenz für Typparameter des Verfahrens war.

+0

Vielen Dank für Ihre Antwort! Weißt du, ob 'zipWithKeys' wirklich dazu gedacht ist? Ich habe das Gefühl, dass es einen einfacheren Ansatz geben muss. Könnte das ein Fehler in Formlos sein? – Roman

+0

Dies ist definitiv kein Fehler in formlos. Dies ist eine Einschränkung der Algorithmen für die Typinferenz, die vom Compiler verwendet werden. Sie können eine überladene Version von 'zipWithKeys' verwenden:' '(" value ":: HNil) .zipWithKeys [Witness.'" key "' .T :: HNil] ''. Dies ermöglicht, einige Code-Duplizierungen zu vermeiden. Dieses 'zipWithKeys' arbeitet auf Typenebene anstatt auf den ersten' zipWithKeys', die sowohl auf Typ- als auch auf Wertebene arbeiten. –

+1

Es beginnt Sinn zu machen. Danke! 'val result = (" value ":: HNil) .zipWithKeys [HList. \" key \ ".T]' ist sogar etwas prägnanter. – Roman

Verwandte Themen