2014-10-21 7 views
8

मैं एक इमारत बना रहा हूँ जेनरिक फ़ंक्शन जो HList फॉर्म F[T1] :: ... :: F[Tn] :: HNil के रूप में लेता है, उसे F[T1 :: ... :: Tn :: HNil] में परिवर्तित करता है और उसके बाद उसे उस ब्लॉक में पास करने की आवश्यकता होती है, जिसमें इसे काम करने के लिए, मुझे उस F[_] में एचएलिस्ट प्रकार निकालने की आवश्यकता है । मैं कुछ निराकार के तहत 'hlistconstraints दूर से प्रासंगिक पाया है:नक्शा बेकार hlist प्रकार एफ [टी 1] :: ... :: एफ [टीएन] :: एचएनआईएल प्रकार टी 1 :: ... :: टीएन :: एचएनआईएल (प्रकार स्तर अनुक्रम)

/** 
* Type class witnessing that every element of `L` has `TC` as its outer type constructor. 
*/ 
trait UnaryTCConstraint[L <: HList, TC[_]] 

... लेकिन यह केवल यह सत्यापित करने के hlist में वास्तव में सिर्फ F[_] से बना है पारित कर दिया इस्तेमाल किया जा सकता; ऐसा लगता है कि _ बिट निकालने के लिए कोई रास्ता नहीं है, ताकि स्वयं की एक सूची में कह सकें।

मुझे नौकरी करने के लिए कुछ कहां ढूंढना चाहिए? या मुझे बस बॉक्स से कुछ भी खोजने की उम्मीद नहीं करनी चाहिए और इसके बजाय टाइप गणना स्वयं बनाना चाहिए?

प्रकटीकरण: यह प्रश्न Generic transform/fold/map over tuple/hlist containing some F[_] पर सहायक है लेकिन फिर भी कम से कम एक स्टैंडअलोन प्रश्न के रूप में उपयोगी है, मेरी राय में।

+0

क्या आप एक साधारण मामले के लिए इनपुट और अपेक्षित आउटपुट का उदाहरण दे सकते हैं? – Nate

+0

क्या यह भी संभव है? सूची नहीं [Int] :: सूची [स्ट्रिंग] :: HList' केवल 'सूची [Int :: स्ट्रिंग :: HList] बनने में सक्षम हो जाएगा' iff प्रत्येक सूची सटीक लंबाई की थी या आप देख रहे हैं एक क्रॉस उत्पाद बनाने के लिए? – Nate

+0

@Nate: अच्छा बिंदु; आइए बस यह कहें कि इसे प्रमाणीकरण और विकल्प जैसी चीजों के साथ काम करने की ज़रूरत है, जिसमें केवल एक ही तत्व में निहित है। –

उत्तर

3

लगता है पहले से ही इस करता Sequencer की तरह:

import scala.language.higherKinds 

class Wrap[TC[_]] { 
    def foo[L1 <: HList, L2 <: HList](xs: L1)(implicit 
    seq: Sequencer.Aux[L1, TC[L2]] // L2 is the type we're looking for 
): L2 = ??? 
} 

val ret = new Wrap[Option].foo(1.some :: 2.some :: HNil) 
// ret now has type Int :: Int :: HNil 

... लेकिन मैं

  • द्वारा इस अच्छे से छुटकारा पाने के बनाने के लिए वर्तमान में एक तरह से के बारे में सोच करने में असमर्थ हूँ रैपर वर्ग;
  • स्केल infer TCOption होने के लिए।

नोट: मुझे लगता है कि यह एक जवाब के रूप में कुछ हद तक उपयोगी है लेकिन मैं इसे स्वीकार नहीं कर रहा हूँ - उम्मीद किसी को एक अधिक सामान्य और अच्छे के लिए देख समाधान के साथ ऊपर आ जाएगा।

संबंधित मुद्दे