2010-07-28 12 views
24

मैंने इसके लिए गुगल करने की कोशिश की लेकिन मुझे जो कुछ मिला वह मामूली हस्तियों के बारे में कहानियां थीं। दस्तावेज की कमी को देखते हुए, DList क्या है?एक डीएलआईस्ट क्या है?

+10

मैं केवल हस्तियों के बारे में एक हासकर टिप्पणी करने का मौका के लिए इस प्रश्न पर क्लिक किया। लेकिन यह पहले से ही प्रश्न में था ... +1 –

उत्तर

21

यह एक अलग सूची है, "Difference List as functions"

scala> val (l1, l2, l3) = (List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) 
l1: List[Int] = List(1, 2, 3) 
l2: List[Int] = List(4, 5, 6) 
l3: List[Int] = List(7, 8, 9) 

कुशल prepending की तर्ज पर:

scala> l1 ::: l2 ::: l3 
res8: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) 

अकुशल appending। यह एक मध्यवर्ती सूची (एल 1 ++ l2), तो ((एल 1 ++ l2) ++ L3)

scala> l1 ++ l2 ++ l3 // inefficient 
res9: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) 

DList भंडार अप संलग्न कर देता है बनाता है, और केवल एक पूरी सूची बनाने के लिए की जरूरत है, प्रभावी ढंग से लागू:

scala> List(l1, l2, l3) reduceRight (_ ::: _) 
res10: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) 
+0

नियमित रूप से तैयार नहीं हो रहा है स्कैला सूची :: :: अभी भी उपसर्ग की लंबाई में रैखिक है? या क्या कोई अतिरिक्त कोड है जो बेहतर करने के लिए उनकी अपरिवर्तनीयता का शोषण करता है? –

+5

'DList' के साथ, कुल ऑपरेशन अभी भी' ओ (एन * एम) 'है, जहां' n' भाग की संख्या है और 'm' खंड आकार है। '++' के साथ, ऑपरेशन 'ओ (एन * एन * एम) 'है – retronym

2

यह गैर-कैननिकल scalaz पैकेज में डेटा प्रकार है, जो दोनों सिरों पर निरंतर-समय पहुंच के साथ टाइप की गई सूचियों के लिए उपयोगी है। (चाल "स्केला" और "dlist" के लिए गूगल के लिए है।)

+0

मुझे लगता है कि यह गैर-स्कैला-विशिष्ट –

+0

थाली स्टैक को ओवरफ़्लो में पाया गया था और स्कालज़ से हटा दिया गया था: http://code.google.com/p/scalaz/मुद्दों/विवरण? आईडी = 1 9 –

+0

@WillSargent DList को 2011 में स्कालज़ में वापस जोड़ा गया था https://github.com/scalaz/scalaz/commit/0c299ee4c15049310f2a5b229f46f5d5621d6702 –

1

project page of scalaz से:

DList, निरंतर समय संलग्न/बढ़ाएँ संचालन के साथ एक ही प्रकार के तत्वों का प्रतिनिधित्व करने के लिए एक डेटा प्रकार।

+0

लिंक अब और काम नहीं करता है :( – marios

10

अंतर सूचियों एक सूची की तरह डेटा संरचना है कि हे (1) संलग्न आपरेशन का समर्थन करता है कर रहे हैं।

संलग्न करें, और सूची को संशोधित करने वाले अन्य संचालन को सीधे सूची की प्रतिलिपि बनाने के बजाय संशोधन कार्यों की फ़ंक्शन संरचना के माध्यम से दर्शाया जाता है।

एक उदाहरण है, Haskell's dlist library से:

-- Lists as functions 
newtype DList a = DL { unDL :: [a] -> [a] } 

-- The empty list 
empty  = DL id 

-- The append case: composition, a la Hughes 
append xs ys = DL (unDL xs . unDL ys) 

-- Converting to a regular list, linear time. 
toList  = ($[]) . unDL 

तकनीक कम से कम Hughes 84, सूचियों में से एक उपन्यास प्रतिनिधित्व और कार्य करने के लिए अपने आवेदन करने के लिए, आर जॉन ह्यूजेस, 1984 "रिवर्स" वापस चला जाता है। , जहां, वह कार्यों के रूप में सूचियों का प्रतिनिधित्व करने का प्रस्ताव करता है, और फ़ंक्शन संरचना के रूप में संलग्न करता है, उदाहरण के लिए अनुमति देता है रैखिक समय में चलाने के लिए विपरीत। कागज से:


enter image description here

enter image description here