2013-10-14 2 views
0

지속 할 수있는 방법이 있습니까? (가능합니까?) 동적으로 성장하는 HList? 내 의사 코드 :동적으로 성장하는 이기종 목록 인 Scala

var llist = 1 :: 2 :: "foo" :: true :: HNil 
var list: HList = HNil // here is a wrong type! in fact we dont need HList type 

object mapFunc extends Poly1 { 
    implicit def default[T] = at[T](t => { list = t :: list }) 
} 

llist map mapFunc 

분명히이 코드는 작동하지 않습니다. 그래서 ofc 작동하지만 우리는 심지어 list.head을 입력하여 잘못된 HList을 입력 할 수도 있습니다. (나는 list이 타입 매개 변수를 전혀 보관하지 않는다고 인식합니다).

결과 유형 :

shapeless.HList = true :: foo :: 2 :: 1 :: HNil 

그래서, 그 잘못이다.

편집

상기 정보 나 참조 충분하지 않다.

그래서 어떤 종류의 변수를 갖고 싶었고 어떤 변수가 어떤 종류 일 수 있습니다. HList 유형이 될 수 있습니다.

class className { 
    var hlist: HList = _ // it is not correct 
} 

때때로이 변수에 HList을 전달합니다.

className.hlist = llist 

p.s. @ milessabin 메가 바이트 바로 그게 내 문제에 대한 또 다른 해결책을 찾는 것이 좋습니다.

+0

지속성의 의미를 명확히 할 수 있습니까? 아마도 당신은 DB에 빠졌다고 생각했습니다. HLIST 목록이나 최종 제품/목표가 필요한지 확실하지 않습니다. – wheaties

+0

좋습니다, thx, 편집했습니다. btw, 동적으로 일부 HList를 사용하여 변수에 요소를 추가하는 것을 의미합니다. 예를 들어 일부 요소를 기존 목록 (예 : 비어 있음)에 추가하는 등의 작업은 가능하지만 변수 유형을 다시 정의 할 수 없기 때문에 불가능합니다. 단순한 목록의 경우 우리는 이것을 수행 할 수 있습니다. 이는 하위 유형 지정의 원인이며 실제로 유형에 대한 정보가 느슨합니다. 그래서 고마워! 질문을 제거하는 것이 가능하지는 않습니까? 유용하지 않으며 가장 가능한 대답은 '아니오'입니다. – DaunnC

+0

동적으로 HList를 확장하는 것이 표준 용도입니다. 그들은 추가했고 모든 것을 바로 빌드했습니다. – wheaties

답변

3

여기에서 달성하려는 내용이 정확히 나에게 분명하지 않습니다. 전반적으로 변경 가능한 업데이트가 아닌 기능적 폴드 및 전개와 관련하여 생각하고 시도해야합니다.

당신이 당신의 질문에 표시 한 특정 문제에 대한 해결책은 그냥

HListreverse 방법 (유형과 값 수준 모두에서) 폴드로 구현 될 수 있으며,
scala> val llist = 1 :: 2 :: "foo" :: true :: HNil 
llist: Int :: Int :: String :: Boolean :: HNil = 1 :: 2 :: foo :: true :: HNil 

scala> llist.reverse 
res0: Boolean :: String :: Int :: Int :: HNil = true :: foo :: 2 :: 1 :: HNil 

발견 된 here.

+0

mb u r 바로 업데이트했습니다. 다른 해결책을 찾으려고합니다. 고마워! – DaunnC