2013-09-21 9 views
5

मैं point और bind कार्यान्वयन के माध्यम से एक Monad निराकार HList के लिए (scalaz) को परिभाषित करने की कोशिश की है के लिए scalaz इकाई उदाहरण परिभाषित करें। पहली समस्या यह है कि HList विशेषता एक प्रकार का कन्स्ट्रक्टर नहीं है, लेकिन इसे प्रकार lambdas के साथ हल किया जा सकता है, point सरल है, लेकिन मुझे bind के लिए सही कार्यान्वयन नहीं मिला, मुझे लगता है कि मुझे चाल के साथ Poly1 के कुछ फ़ंक्शन की आवश्यकता है , लेकिन आकारहीन का वह पक्ष अभी भी मेरे लिए अंधेरा है। HList में सभी कार्यों को सरल सूची की तरह एक मोनाड होना है, तो क्या स्कालज़ से इसे कार्यान्वित करना संभव है?एक निराकार hlist

+2

यह सीधा अर्थ में संभव नहीं है, लेकिन यह एक दिलचस्प सवाल है। उदाहरण के लिए देखें [मेरा जवाब यहां] (http://stackoverflow.com/a/14456938/334519) (मोनैड्स के बजाय आवेदक फ़ैक्टर को शामिल करना), [यह संबंधित उदाहरण] (https://github.com/milessabin/shapeless/ दोषहीन/मास्टर/उदाहरण/src/main/scala/shapeless/example/cartesianproduct.scala) बेकार में, और मेरा (अनुत्तरित) प्रश्न [यहां] (https://twitter.com/travisbrown/status/294064540235210752)। –

+0

स्कैलाज़ अभी भी मेरे लिए अनचाहे क्षेत्र है, लेकिन इसमें आपके लिए आवश्यक विधियों और अंतःक्रियाशीलता हो सकती है: [बेकार कंट्रीब] (https://github.com/typelevel/shapeless-contrib) – EECOLOR

+1

मंडुबियन (http://stackoverflow.com/ उपयोगकर्ता/601296/मंडुबियन) ने एचएलिस्ट के लिए एक मोनोइड के बारे में एक ब्लॉग पोस्ट लिखा: http://mandubian.com/2014/07/29/hmonoid/, जो आपके लिए ब्याज का हो सकता है। – al3xar

उत्तर

0

एक मोनॉयड कुछ संचालनों के साथ एक सेट है जो विशेष कानूनों का पालन करता है। HListM[A] जितना संभव हो उतना तत्व आप विचार कर रहे हैं? आप HListM[A] = HList घोषित यदि किसी भी HList यानी, है, तो आप जल्दी से मिल जाएगा कि आप कर सकते हैं f: A => B साथ नहीं map, identity के रूप में सभी map रों इलाज के अलावा और आप बल्कि नीरस इकाई Id (कुछ अतिरिक्त लेकिन निष्क्रिय निवासियों के साथ में नयापन लाया गया है)।

हम प्रकार HListM[A] = A :: ... :: A :: HNil के साथ एक इकाई बना सकता है (हालांकि यहां तक ​​कि वास्तव में स्काला में उस प्रकार व्यक्त एक चुनौती है - आप एक सहायक विशेषता trait CopiesOf[N <: Nat, A] {type Out <: HList}, आवश्यकता होगी इस के उदाहरण प्रदान करने के लिए implicit रों, और फिर एक अस्तित्व को वास्तव में इसे लिखें (CopiesOf[N, A]#Out forSome {type N <: Nat}))। इसके लिए मोनैड ऑपरेशंस लिखना संभव है, हालांकि आपको ऑपरेशन के बिंदु पर Prepend जैसे बेकार सहायक वर्गों की आवश्यकता होगी, क्योंकि स्कैला में "फोरल" प्रकार व्यक्त करने का कोई वास्तविक तरीका नहीं है - आप _0 के लिए अपने प्रकार के उदाहरण घोषित कर सकते हैं और Succ[N], लेकिन कंपाइलर को साबित करने का कोई तरीका नहीं है कि N <: Nat के लिए कोई उदाहरण है, आपको केवल इन्हें उपयोग करने की आवश्यकता होने पर अंतर्निहित लोगों की आवश्यकता होती है।

लेकिन बहुत सारे काम के बाद आप List[A] पर कुछ आइसोमोर्फिक के साथ समाप्त हो जाएंगे; उस मामले के लिए क्यों न केवल List[A] का उपयोग करें?

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