2012-06-14 1 views
7

유형이없는 방식으로 객체를 쉽게 축적하기 위해 엉성한을 사용하려고합니다.셰이프리스 : 앞머리. 암시 적으로 찾을 수 없음

문제는 concat (:::) 두 개의 HList입니다. 나는 초보자를 만났습니다 (적어도 그것은 보인다). 컨텍스트에서 Prepend 암시 적 인스턴스가 누락됩니다.

그러나 hlist.scala을 살펴보면 이라는 일반 객체가 PrependPrependAux 개체에 정의되어 있음을 알 수 있습니다.

import Prependimport PrependAux을 수동으로 추가해도 아무 것도 변경되지 않았습니다 (분명히 ...).

그래서 여기에 최소로 감소 코드 : 이제 콘솔에서

enter code here 

import shapeless._ 
import HList._ 
import Prepend._ 
import PrependAux._ 

object test { 

    val a:HList = 1 :: 4 :: "A" :: HNil 
    val b:HList = "R" :: false :: HNil 

    val c:HList = a ::: b // <<<<<<<<<<< NEEDS A Prepend in the context 

} 

: 내 눈을 태워해야합니까

[error]  test.scala:10: could not find implicit value for parameter prepend: shapeless.Prepend[shapeless.HList,shapeless.HList] 
[error]  val c:HList = a ::: b // this needs an implicit Prepend in the current context 

? 에 통속화 전에 강한로했기 때문에

감사

편집

약간의 업데이트는, 약간에게 진짜 문제를 다시 complexify합니다. 그들이 HList의 것을

case class A[L<:HList](a:L) { 
    def doSmth[C <:HList](c:C) = a ::: c 
} 

그래서 내가 실제 유형에 대한 액세스가, 내가 아는 적이 없다 : 여기

내가 할 수있을 것입니다 물건의 종류이다.

+0

유일한 답변도 업데이트되었습니다. 여전히 작동합니다. 내 솔루션에 빠진 것은 분명히 scalac 옵션이었습니다 ... –

답변

10

업 캐스트가 HList 인 경우 여기에서 문제가됩니다. 평범한 구식 HList (새 요소를 추가하는 것 외에는)으로 할 수있는 것은 거의 없습니다.

val a: Int :: Int :: String :: HNil = 1 :: 4 :: "A" :: HNil 
val b: String :: Boolean :: HNil = "R" :: false :: HNil 
val c: Int :: Int :: String :: String :: Boolean :: HNil = a ::: b 

을하거나 유형은 일반적으로 훨씬 더 편리하다, 추측 할 수 있습니다 :

당신은 더 많은 정보를 입력 한 주석을 제공 할 수 있습니다 귀하의 코멘트에 대한 응답으로

val a = 1 :: 4 :: "A" :: HNil 
val b = "R" :: false :: HNil 
val c = a ::: b 

: 필요한 증거가 있는지 확인하면 원하는 것을 할 수 있습니다 (a: Aa: L의 오타이고 그쪽은 당신이) 작동이에 대한 -Ydependent-method-types가 필요합니다 T : 일반적으로

case class A[L <: HList](a: L) { 
    def doSmth[C <: HList](c: C)(implicit p: Prepend[L, C]) = a ::: c 
} 

당신은 당신이 사용하고있는 작업에 필요한, 다음 방법에 그들을 포함 implicits 볼 수 있습니다.

+0

Thx, 당신이 완벽하게 맞습니다 (그래서 나는 물론 검증했습니다). 실제로 나의 예는 너무 많은 문제를 줄였습니다.내 문제는 종류가 조금씩 줄어들 기 때문에 (case A [L <: HList] (a : A) {def doSmth [C <: HList> (c : C) = a ::: c}'. 어떻게 생각하니? –

+0

@andypetrella : 귀하의 질문에 답변했습니다. –

+0

당신은 오타가 맞습니다! 미안합니다. 업데이트 Thx (나는 또한 질문을 업데이 트). 실제로 나는 그것을했고, 아마 당신이이 일을하기 위해 이야기했던 옵션이 필요했을 것입니다. 다시 Thx, 나는 그것을 시도 곧 git거야. –