2010-06-08 15 views
6

हास्केल किस प्रकार [[]] (सूचियों की एक सूची) को हल नहीं कर सकता है?
यह क्यों नहीं है * -> *, क्योंकि मैं इसे इंट जैसे प्रकार दे सकता हूं, और [[Int]] प्राप्त कर सकता हूं, जो दयालु * है।जीएचसीआई किस प्रकार [[]] को हल नहीं कर सकता?

+4

यह पूछने की तरह है कि क्यों जीएचसी मूल्य 'sqr के प्रकार का पता नहीं लगा सकता टी sqrt' भले ही 'sqrt' स्वयं 'डबल -> डबल' – newacct

+1

है: टी sqrt sqrt जीएचसीआई में ठीक काम करता है हालांकि – Squidly

+8

ऐसा इसलिए है क्योंकि' sqrt' polymorphic है। एक बेहतर सादृश्य है: टी नहीं। – sdcvvc

उत्तर

8

मुझे लगता है कि, Maybe Maybe साथ की तरह ही है, हालांकि बाद के मामले में कारण शायद स्पष्ट है: "बाहरी" प्रकार निर्माता तरह * का एक प्रकार पारित हो जाने की उम्मीद है, लेकिन प्रकार * -> * का एक प्रकार निर्माता (देखता है "आंतरिक" Maybe/[]) और शिकायतें। यदि मैं सही हूं, तो यह वास्तव में :kind जीएचसीआई की कार्यक्षमता के साथ कोई समस्या नहीं है, बल्कि उच्च-प्रकार के प्रकार के रचनाकारों की संरचना को व्यक्त करने के लिए सही वाक्यविन्यास खोजने के साथ।

समाधान के लिए,

:kind forall a. [[a]] 
:kind forall a. Maybe (Maybe a) 

की तरह कुछ किया जा सकता है (उपयुक्त भाषा विस्तार के साथ चालू - ExistentialQuantification, मुझे लगता है - forall वाक्य रचना सक्षम करने के लिए)।

+1

हास्केल कैफे से यह धागा प्रासंगिक हो सकता है: http://www.mail-archive.com/[email protected]/msg08530.html - प्रकार रचनाकारों की संरचना। –

+0

मुझे नहीं लगता कि अस्तित्व का प्रकार इरादा था (जो '*' है)। एक आसान तरीका, लेकिन जीएचसीआई के बाहर, एक टाइप करें [[ए]] '(जो '* -> *' है)। – sdcvvc

+1

@ एसडीसीवीवीसी जो सार्वभौमिक रूप से मात्राबद्ध पॉलीमोर्फिक प्रकार है (अस्तित्व में नहीं है)। –

4

यदि हम [[]][] [] के रूप में desugar तो यह स्पष्ट है कि यह खराब तरह से दयालु है क्योंकि [] :: * -> *

यदि आप वास्तव में "सूचियों की सूची" चाहते थे तो आपको * -> * के दो प्रकार के रचनाकारों को लिखने की आवश्यकता है। आप इसे थोड़ा बॉयलरप्लेट के बिना नहीं कर सकते क्योंकि हास्केल में टाइप-लेवल लैम्ब्डा नहीं है।

newtype Comp f g a = Comp { unComp :: f (g a) } 

अब आप लिख सकते हैं:: आप इस हालांकि कर सकते हैं

type ListList = Comp [] [] 

और यह का उपयोग कर कार्यों लिखें:

f :: ListList Int -> ListList Int 
f = Comp . map (map (+1)) . unComp 

इस तरह functor रचना कई क्षेत्रों में अनुप्रयोगों, विशेष रूप से Swierstra की है "Data types a la carte"

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