शीर्षक यह सब कहता है, वास्तव में; सामग्रियों के बाहर राज्य को संरक्षित करते समय संग्रह को पुन: स्थापित करना और तत्वों से बाहर निकलने के अलावा समाप्ति स्थिति के आधार पर पुनरावृत्ति परिष्करण करना आवश्यक प्रोग्रामिंग में कुछ भी हासिल करने के लिए सबसे आम पैटर्न हो सकता है। मुझे ऐसा लगता है लेकिन जैसे कि यह कुछ कार्यात्मक gentleprogrammers बारे में बात नहीं पर सहमति व्यक्त की है, या कम से कम मैं इसे कभी नहीं या इस तरह के map
, fold
, reduce
साथ के रूप में एक अर्द्ध Standarized नाम के लिए एक मुहावरा का सामना करना पड़ा, आदिक्या कार्यात्मक प्रोग्रामिंग में 'ब्रेक विद ब्रेक' या 'संचयक के साथ ढूंढ' के लिए कोई अवधारणा है?
मैं अक्सर उपयोग स्केल में फॉलोइनिग कोड:
implicit class FoldWhile[T](private val items :Iterable[T]) extends AnyVal {
def foldWhile[A](start :A)(until :A=>Boolean)(op :(A, T)=>A) :A = {
if (until(start)) start
else {
var accumulator = start
items.find{ e => accumulator = op(accumulator, e); until(accumulator) }
accumulator
}
}
}
लेकिन यह बदसूरत है। जब भी मैं एक और अधिक कथात्मक तरीके का प्रयास करें, मैं भी लंबे समय तक और लगभग निश्चित रूप से धीमी कोड, सदृश करने के लिए साथ आते हैं:
Iterator.iterate((start, items.iterator)){
case (acc, i) if until(acc) => (acc, i)
case (acc, i) if i.hasNext => (op(acc, i.next()), i)
case x => x
}.dropWhile {
case (acc, i) => !until(acc) && i.hasNext
}.next()._1
(एक और अधिक कार्यात्मक संस्करण List
या Stream
रों का प्रयोग करेंगे, लेकिन iterators परिवर्तित करने से यकीनन कम भूमि के ऊपर है items
Stream
पर, क्योंकि बाद के लिए डिफ़ॉल्ट कार्यान्वयन किसी भी प्रकार के नीचे एक इटरेटर का उपयोग करता है)।
मेरे प्रश्न हैं:
1) इस अवधारणा को कार्यात्मक प्रोग्रामिंग में एक नाम है, और यदि हां, इसके कार्यान्वयन के साथ जुड़े पैटर्न क्या है?
2) स्केल में इसे लागू करने के लिए सबसे अच्छा (यानी संक्षिप्त, सामान्य, आलसी, और कम से कम ओवरहेड) तरीका क्या होगा?
मैंने कभी नहीं समझा है कि इसका मानक कार्यान्वयन क्यों नहीं है। हाँ। पूंछ रिकर्सन ऐसा करने का तरीका है, लेकिन यह थोड़ा बदसूरत है (और एक सहायक फ़ंक्शन की आवश्यकता होती है जिसके लिए किसी को नाम ढूंढना होगा, जो हमेशा मुझे एक कोड गंध महसूस करता है)। .mapUntil' और 'foldLeftUntil' आदि मुझे उपयोगी चीजें नहीं लगती हैं ... –