2012-03-22 20 views
5

another question में कार्यात्मक समकक्ष, मैंने जावा के समवर्ती मल्टीमैप के बारे में पूछा।समवर्ती मल्टीमैप

क्या कुछ कार्यात्मक प्रोग्रामिंग (अपरिवर्तनीय) पैटर्न है जिसका उपयोग स्कैला या क्लोजर प्रोग्राम में किया जा सकता है? मैं छवि करता हूं कि स्कैला समाधान में शायद अभिनेता और क्लोजर एक atom, ref या agent शामिल होगा, लेकिन एक बेहतर तरीका हो सकता है। चूंकि दोनों भाषाएं जावा इंटरऑप पर "वापस गिरने" की अनुमति देती हैं और केवल जावा समाधान का उपयोग करने की अनुमति देती हैं, इसलिए मैं अपने पहले प्रश्न पर जो भी उत्तर प्राप्त करता हूं, उसका उपयोग कर सकता हूं, लेकिन यह कार्यात्मक प्रोग्रामिंग प्रतिमान का पालन नहीं करेगा। हास्केल प्रोग्रामर इसे कैसे हल करते हैं?

+1

यह एक आम धारणा है कि हास्केल उत्परिवर्तन अनुमति नहीं देता है में स्काला में एक कार्यान्वयन है। ऐसा होता है। पकड़ यह है कि सभी उत्परिवर्तन प्रकारों में विधिवत ध्यान दिया जाना चाहिए; इसलिए म्यूटेशन इंटरफेस के साथ एक साथ उत्परिवर्तन संचालन लिखने का सामान्य तरीका है। हास्केलर स्काला और क्लोजर के समान ही व्यवहार्यता के लिए "वापस आ सकते हैं", हास्केल को छोड़कर आप धोखा नहीं दे सकते हैं और इसे एक समारोह की तरह दिखाना शुद्ध नहीं है जब यह नहीं है। हालांकि, अगर आप अपने फ़ंक्शन में उत्परिवर्तन को पूरी तरह से समाहित कर सकते हैं, तो यह अभी भी एक शुद्ध इंटरफ़ेस का पर्दाफाश कर सकता है। –

उत्तर

7

मानक क्लोजर मानचित्र और सेट अपरिवर्तनीय (और लगातार) [1] हैं, इसलिए वे समवर्ती कार्यक्रमों में भी काम करते हैं। आप उन्हें अपनी आवश्यकताओं के आधार पर एक रेफरी/एजेंट/var/atom में स्टोर करना चाहते हैं, और आप अभी भी ref/agent/var/atom को हमेशा के रूप में अपडेट कर सकते हैं।

आप एक और अधिक परिवर्तनशील मानचित्र हो सकता है, अगर मान इस तरह, refs वास्तव में कर रहे हैं:

{:a (ref #{1 2 3}) 
:b (ref #{4 5 6})} 

इस मामले में, आप वास्तव में मूल्यों पहले से ही विद्यमान की कुंजी (के लेन-देन में जोड़ने के लिए सक्षम हो जाएगा पाठ्यक्रम)। इसके अलावा और चाबी को हटाने अभी भी नए नक्शे वापस आ जाएगी, मूल नक्शे के रूप में ही refs साझा करेंगे जो है, और इसलिए उनमें से एक में परिवर्तन दूसरों को दिखाई हो जाएगा:

user=> (def mmap {:a (ref #{1 2 3}) :b (ref #{4 5 6})}) 
#'user/mmap 
user=> mmap 
{:a #<[email protected]: #{1 2 3}>, :b #<[email protected]: #{4 5 6}>} 
user=> (def mmap2 (assoc mmap :c (ref #{7 8 9}))) 
#'user/mmap2 
user=> mmap2 
{:C#<[email protected]: #{7 8 9}>, :a #<[email protected]: #{1 2 3}>, :b #<[email protected]: #{4 5 6}>} 
user=> mmap 
{:a #<[email protected]: #{1 2 3}>, :b #<[email protected]: #{4 5 6}>} 
user=> (dosync (alter (:a mmap2) conj 0)) 
#{0 1 2 3} 
user=> mmap 
{:a #<[email protected]: #{0 1 2 3}>, :b #<[email protected]: #{4 5 6}>} 
user=> mmap2 
{:C#<[email protected]: #{7 8 9}>, :a #<[email protected]: #{0 1 2 3}>, :b #<[email protected]: #{4 5 6}>} 

[1] यही है, जोड़ने/कुंजी को हटाने/संशोधित करना, और मूल्य मूल रूप से मूल किए बिना, एक नया मानचित्र वापस कर देते हैं।

3

एक कार्यात्मक डेटा संरचना एक अपरिवर्तनीय डेटा संरचना है। अपरिवर्तनीय डेटा संरचनाओं में सहमति के साथ समस्या नहीं है क्योंकि उन्हें संशोधित नहीं किया जा सकता है।

+0

एक अभिनेता (या अभिनेता की तरह वर्ग) इस डेटा संरचना का प्रबंधन करने के लिए एकमात्र थ्रेड-सुरक्षित तरीका है। – Ralph

+2

@ राल्फ बिल्कुल नहीं। अभिनेता उपयोगी हैं, लेकिन वे किसी भी सहमति के मुद्दे के लिए पकड़ नहीं हैं। डैनियल Saya के रूप में, आप एक अपरिवर्तनीय संरचना के किसी भी तरह के प्रबंधन की जरूरत नहीं है। प्रश्न तब बन जाता है कि आपको उत्परिवर्तन की आवश्यकता है, और यदि ऐसा है तो। अधिक जानकारी यहां मदद करेगी। – Submonoid

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