2017-12-07 3 views
1

저는 최근에 셰이프를 가지고 놀았습니다.셰이프가없는 zipWithKeys : 암시 적 매개 변수를 찾을 수 없습니다.

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

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

I 출력 확장 기록이 조각을 기대 : 나는 주위에 내 머리를 정리 할 수없는이 매우 기본적인 것이있다. 그러나 컴파일러는 withKeys에 대한 암시를 찾을 수 없습니다 :

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) 

그것은 더욱 혼란, 나는 형태 볼품없는 '테스트 케이스를했다 예로의 완벽하게 작동합니다 : 나는 무엇을 놓치고

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

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

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

?

+0

수입은 무엇입니까? –

+0

안녕하세요 @ GáborBakos, 업데이트 된 질문보기 :) – Roman

답변

2

다음 코드는 컴파일 :

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

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

는 그래서이 메소드의 형식 매개 변수에 대한 형식 유추에 문제가 있었다 것 같다.

+0

답변에 많은 감사드립니다! 'zipWithKeys'가 정말 그렇게 사용되도록 의도 된 것인지 알고 있습니까? 보다 직설적 인 접근 방식이 있어야하는 것처럼 느껴집니다. 이것이 엉망이 된 버그일까요? – Roman

+0

이것은 확실히 엉성한에서 버그가 아닙니다. 이것은 컴파일러가 사용하는 타입 유추 알고리즘의 한계입니다. 'zipWithKeys'의 오버로드 된 버전을 사용할 수 있습니다 :''("value":: HNil) .zipWithKeys [Witness.' "key"'.T :: HNil]''. 이렇게하면 코드 중복을 피할 수 있습니다. 이'zipWithKeys'는 유형과 값 수준 모두에서 작동하는 첫 번째'zipWithKeys' 대신에 유형 수준에서 작동합니다. –

+1

그것은 이해되기 시작합니다. 고마워! 'val result = ("value":: HNil) .zipWithKeys [HList. \' "key"\'.T]'는 좀 더 간결합니다. – Roman

관련 문제