2012-08-13 18 views
5

मैं अभी भी इस विदेशी कार्यात्मक प्रतिमान सीख रहा हूं ...मुझे एक सूची कैसे बनाना चाहिए और इसे क्लोजर में वापस करना चाहिए?

क्लोजर में और एक कार्यात्मक तरीके से मैं निम्नलिखित कोड कैसे लिखूं? मान लें कि इस गायब हिस्सों को कहीं और परिभाषित किया गया है और टिप्पणियों में वर्णित व्यवहार के रूप में व्यवहार किया गया है। यहां यह पायथन में है, जिसे मैं परिचित हूं।

usernames = [] 
# just the usernames of all the connections I want to open. 
cancelfunctions = {} 
# this global contains anonymous functions to cancel connections, keyed by username 

def cancelAll(): 
    for cancel in cancelfunctions.values(): 
     cancel() 

def reopenAll(): 
    cancelfunctions = {} 
    for name in usernames: 
     # should return a function to close the connection and put it in the dict. 
     cancelfunctions[name] = openConnection() 

सभी मैं सच में पता करने की जरूरत है कि कैसे, कॉलबैक की एक नई शब्दावली का निर्माण करने के reopenAll समारोह में की तरह है, लेकिन मैं कुछ और संदर्भ यहाँ शामिल कर रहा हूँ क्योंकि संभावना है कि मैं कार्यात्मक किसी तरह का करने से कर रहा हूँ कर रहे हैं प्रतिमान अत्याचार, और आप शायद पूरे कार्यक्रम को ठीक करना चाहते हैं। :)

+0

मुझे पता है कि यह संभवतः उचित नहीं है, लेकिन जब मैंने "[विदेशी कार्यात्मक प्रतिमान] (http://landoflisp.com/#guilds)" के संदर्भ को देखा तो मैं साझा करने का विरोध नहीं कर सका। – DaoWen

उत्तर

6

क्लोजर में डेटा संरचनाओं का निर्माण अक्सर reduce होता है, जो एक फ़ंक्शन में इनपुट के अनुक्रम को प्राप्त करता है जो अंतिम वापसी मूल्य जमा करता है। यहां एक फ़ंक्शन लिखने के दो तरीके हैं जो उपयोगकर्ता नाम के मानचित्र (यानी शब्दकोश) को open-connection के वापसी मूल्य पर बनाते हैं।

;; Using reduce directly 
(defn reopen-all [usernames] 
    (reduce 
    (fn [m name] (assoc m name (open-connection))) 
    {} usernames)) 

;; Using into, which uses reduce under the hood 
(defn reopen-all [usernames] 
    (into {} (for [name usernames] 
      [name (open-connection)]))) 

ध्यान दें कि ये दो कार्य एक मूल्य लौटाते हैं और वैश्विक स्थिति को म्यूट नहीं करते हैं, क्योंकि आपका पायथन कोड करता है। वैश्विक स्थिति स्वाभाविक रूप से खराब नहीं है, लेकिन राज्य में हेरफेर से मूल्य-पीढ़ी को अलग करना अच्छा होता है।

(def usernames [...]) 
(def cancel-fns (atom nil)) 

(defn init [] 
    (reset! cancel-fns (reopen-all usernames))) 

और यहाँ पूर्णता 'खातिर cancel-all है:: राज्य के लिए, आप शायद एक atom चाहता हूँ

def reopen(usernames): 
    return dict((name, openConnection()) for name in usernames) 

आप पा सकते हैं:

(defn cancel-all [] 
    (doseq [cancel-fn (vals @canel-fns)] 
    (cancel-fn))) 
+0

धन्यवाद, यह एक बहुत अच्छा जवाब है! – user1552512

2

यहाँ अजगर में एक कार्यात्मक दृष्टिकोण है मुख्य रूप से कार्यात्मक भाषा का उपयोग करने से पहले पायथन में एक कार्यात्मक शैली में "अनुवाद" करना आसान है।