2015-09-25 10 views
6

प्रश्न 1 उनके प्रकार द्वारा HList तत्वों को प्रतिबंधित करने की कोशिश कर रहा - मूल LUBConstraintsनिराकार:

मेरी पहली मौजूदा LUBConstraints के साथ चारों ओर खेलने की कोशिश सबूत (नीचे दिए गए कोड ब्लॉक देखें) लापता के लिए विफल रहता है। कोई संकेत क्यों? एक खाली सूची लंबी सूची की वैध सूची नहीं है? कोई तत्व बाधा का उल्लंघन नहीं करता है।

import shapeless.ops.coproduct 
import shapeless.{::, :+:, Coproduct, HNil, HList} 

object testLUBConstraints { 
    import shapeless.LUBConstraint._ 

    // !!! see comment on question - this satisfies the implicit below!!! 
    // implicit val hnilLUBForLong = new LUBConstraint[HNil.type, Long] {} 

    def acceptLong[L <: HList : <<:[Long]#λ](l: L) = true 
    val validLong = acceptLong(1l :: HNil) 

    val validEmpty = acceptLong(HNil) 
    // => WHY??? Error: could not find implicit value for evidence parameter of type shapeless.LUBConstraint[shapeless.HNil.type,Long] 
    // MY EXPECTATION WAS: 'implicit def hnilLUB[T] = new LUBConstraint[HNil, T] {}' defined within LUBConstraint companion should provide so 

    // val invalid = acceptLong(1.0d :: HNil) -> fails due to missing evidence (as expected) 
} 

किसी भी मदद की सराहना की।

: पैरामीटर प्रकार से मामले की कक्षाओं को प्रतिबंधित ( Shapeless: restricting case class types एक separat प्रश्न में विभाजित) -

प्रश्न 3: -

प्रश्न 2 खुद की बाधा Coproduct का उपयोग कर (Shapeless: own HList constraint using Coproduct एक अलग सवाल में विभाजित)

+0

मैं स्थानीय रूप से 'अंतर्निहित वैल hnilLUBForLong = नया LUBConstraint [HNil.type, Long] {}' घोषित करके पहले ERROR (_Question 1_ के कोड ब्लॉक में) प्राप्त करने में कामयाब रहा - ऐसा लगता है कि घोषित घोषित मूल्य विधि बिल्कुल मिलान टाइप नहीं करती है: 'LUBConstraint [HNil, Long] =! = LUBConstraint [HNil.type, Long] ' इरादा या यहां तक ​​कि एक बग भी? – sthielo

+0

सीपीसीऑनस्ट्रेन के अंतर्निहित संकल्प पर काम कर रहा है (देखें _Question 2_) 'वैल एचएलएलओएन: :: [लांग, एचएनआईएल] = 1 एल :: एचएनआईएल 'और इसके लिए एक अंतर्निहित वैल सीपीसीएलओएन = निहित [सीपीसीओस्ट्रेन [ hlLong.type, CPType]] 'मैंने 'implicit val scpcEmptyLong1: CPConstraint [:: [Long, HNil], CPType] = new CPConstraint [:: [Long, HNil], CPType] {}', जो ** नहीं करता है ** निहित खोजी गई लेकिन 'अंतर्निहित वैल scpcEmptyLong2: CPConstraint [hlLong.type, CPType] = new CPConstraint [hlLong.type, CPType] {}' होगा। - क्यूं कर??? क्या फर्क पड़ता है? – sthielo

+0

यह शायद तीन अलग-अलग प्रश्न होना चाहिए। पहले मामले में आप 'HNil' को' HNil' के रूप में स्पष्ट रूप से टाइप करके समस्या को ठीक कर सकते हैं: 'स्वीकार करें (एचएनआईएल: एचएनआईएल)' को संकलित करना चाहिए। –

उत्तर

4

मूल्य HNil का अनुमानित प्रकार सिंगलटन प्रकार HNil.type होगा, जो HNil का उचित उप प्रकार है। चूंकि LUBConstraint जैसे वर्गों का प्रकार परिवर्तनीय है, HNil के लिए कोई भी उपलब्ध उदाहरण नहीं मिलेगा यदि आप HNil.type के लिए एक उदाहरण मांग रहे हैं।

some discussionHNil की परिभाषा को बदलने के लिए some discussion रहा है ताकि यह काम करेगा, लेकिन यह मामूली नहीं है, और यह स्पष्ट नहीं है कि परिवर्तन के सभी प्रभाव वांछनीय हैं। इस बीच आप मूल्य को उजागर करने के लिए HNil: HNil लिख सकते हैं।

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