आपका विश्लेषण, कि स्केला के प्रकार प्रणाली एक "उच्च kinded प्रकार" नहीं होने के रूप में स्ट्रिंग को अस्वीकार कर देंगे * -> * सही है। यही कारण है,
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], FA_Is_That: F[A] <%< That)
है प्रकार स्ट्रिंग नहीं (मैं इस जांच न की हो) अंतर्निहित रूपांतरण किसी भी एफ आप की कोशिश कर सकते के लिए F[_]
को आबंटित है ... ... लेकिन यह है कि उपयोगी मैं नहीं होगा संदिग्ध क्योंकि आपको अपने स्वयं के bespoke रूपांतरण प्रदान करना होगा जहां आवश्यक हो लेकिन प्रदर्शन भी भयानक होगा, यह मानते हुए कि यह कोड का एक गर्म हिस्सा है।
या, मानक पुस्तकालय का उपयोग कर, आप CanBuildFrom
मशीनरी इस्तेमाल कर सकते हैं लेकिन यह स्पष्ट कतई नहीं है कि कैसे अच्छी तरह से इस scalaz शैली typeclasses साथ मिश्रण होगा।
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], b: CanBuildFrom[A, F[A], That]): That
विधि के शरीर में, जाहिर है, आप वापसी मान के निर्माण के लिए निर्माता का उपयोग करना, के रूप में monoid/शुद्ध typeclasses करने का विरोध किया है, उन्हें कुछ हद तक निरर्थक प्रतिपादन की आवश्यकता होगी, मुझे लगता है।
स्रोत
2011-10-03 07:14:48
आपको केवल मोनॉयड [एफ] के बजाय मोनॉयड [एफ [ए]] की आवश्यकता क्यों है? – CheatEx
@CheatEx, इस मामले में, मैं वह नहीं हूं जिसने 'foo' लिखा था, मैं सिर्फ कॉलर हूं। – huynhjl