17

मुझे हाल ही में कार्यात्मक प्रोग्रामिंग (हास्केल और स्कैला में) के बारे में पता चल रहा है। इसकी क्षमताओं और लालित्य काफी आकर्षक है।क्या कोई बीजगणितीय संरचनाएं कार्यात्मक प्रोग्रामिंग अन्य में मोनॉयड में उपयोग की जाती हैं?

लेकिन जब मैं मोनाड्स से मिले बीजगणितीय संरचना का उपयोग करता हूं, तो मैं आश्चर्यचकित हूं और गणित से सीखने वाले सैद्धांतिक ज्ञान को प्रोग्रामिंग में उपयोग करने के लिए मुझे आश्चर्य हुआ।

इस अवलोकन मेरे मन में एक सवाल लाया: समूह, फील्ड्स या रिंग्स (दूसरों के लिए Algebraic Structures देखें) कर सकते हैं और अधिक अमूर्त और कोड पुन: उपयोग के प्रयोजनों के लिए प्रोग्रामिंग में इस्तेमाल किया और गणित एक जैसे प्रोग्रामिंग को प्राप्त किया जा?

जैसा कि मुझे पता है, Fortress नाम की भाषा (जो कि जब मैं संकलक पूरा हो जाता हूं तो मैं निश्चित रूप से किसी भी भाषा को पसंद करता हूं) इन संरचनाओं को अपने पुस्तकालय कोड में परिभाषित करता है। लेकिन केवल उन प्रयोगों को मैंने देखा जो संख्यात्मक प्रकारों के लिए थे, जिन्हें हम पहले ही परिचित हैं। क्या उनमें से कोई अन्य उपयोग हो सकता है?

सादर, ciun

+0

यह वही नहीं है जो आप खोज रहे हैं, लेकिन आलेख * टाइपक्लासोपियाडिया * [मोनड. रीडर के मुद्दे 13 में) (http://www.haskell.org/wikiupload/8/85/TMR- Issue13.pdf) अभी भी ब्याज का हो सकता है: यह हास्केल प्रीलूड से कई प्रकार के वर्गों ('फेंक्टर', 'आवेदक', 'मोनोइड', 'मोनाड',' एरो 'इत्यादि) का विस्तृत विवरण है। – stakx

उत्तर

10

आप कई संरचनाओं को मॉडल कर सकते हैं। आप mult (Dual CAB, 5) (Dual CBA, 1) लिख सकते हैं और एक परिणाम प्राप्त कर सकते हैं

class Group a where 
    mult :: a -> a -> a 
    identity :: a 
    inverse :: a -> a 

instance Group Integer where 
    mult = (+) 
    identity = 0 
    inverse = negate 

-- S_3 (group of all bijections of a 3-element set) 
data S3 = ABC | ACB | BAC | BCA | CAB | CBA 
instance Group S3 where 
    mult ABC x = x 
    ... -- some boring code 
    identity = ABC 
    inverse ABC = ABC 
    ... -- remaining cases 

-- Operations on groups. Dual: 
data Dual a = Dual { getDual :: a } 
instance Group a => Group (Dual a) where 
    mult (Dual x) (Dual y) = Dual (mult y x) 
    identity = Dual identity 
    inverse (Dual x) = Dual (inverse x) 

-- Product: 
instance (Group a, Group b) => Group (a,b) where 
    mult (x,y) (z,t) = (x `mult` z, y `mult` t) 
    identity = (identity, identity) 
    inverse (x,y) = (inverse x, inverse y) 

अब,: यहाँ एक समूह है। यह समूह एस * ⨯ जेड में एक गणना होगी। आप अन्य समूहों को जोड़ सकते हैं, उन्हें किसी भी संभावित तरीके से जोड़ सकते हैं और उनके साथ कंप्यूटेशंस कर सकते हैं।

इसी तरह की चीजें अंगूठियां, फ़ील्ड, ऑर्डरिंग, वेक्टर रिक्त स्थान, श्रेणियों आदि के साथ की जा सकती हैं। हास्केल की संख्यात्मक पदानुक्रम दुर्भाग्य से बुरी तरह से मॉडलिंग की जाती है, लेकिन numeric prelude है जो इसे ठीक करने का प्रयास करता है। इसके अलावा DoCon है जो इसे चरम पर ले जाता है। प्रकार के वर्गों (मुख्य रूप से श्रेणी सिद्धांत द्वारा प्रेरित) के दौरे के लिए, Typeclassopedia है जिसमें उदाहरणों और अनुप्रयोगों की एक बड़ी सूची है।

3

हास्केल के Arrows monads का सामान्यीकरण कर रहे हैं और शायद ही प्रासंगिक हैं।

2

मैं एडवर्ड Kmett के बहुत पठनीय blog और category extras पैकेज से संबंधित अनुशंसा करता हूं। आपको वर्षों तक व्यस्त रखना चाहिए।