2012-02-12 5 views

उत्तर

8

Stream का प्रतिनिधित्व lazy और संभावित अनंत सूची है। चूंकि एसएमएल eager है, इसलिए इसे थोड़ा चौराहे में किया जाना चाहिए। कैसे साधारण सूचियों पर

आइए पहले देखो काम:

datatype 'a list = [] | :: of 'a * 'a list 

विपक्ष दो हिस्से होते हैं:

  • सूची
  • सूची
के बाकी हिस्सों में पहला तत्व

आलसी सूची में, यह काफी समान है।

datatype 'a Stream = Nil | Cons of 'a * (unit -> 'a Stream) 

यहाँ विपक्ष निम्नलिखित शामिल हैं:

  • सूची में पहले तत्व
  • एक समारोह है कि का उत्पादन सूची करते हुए बाकी ()
पर मूल्यांकन

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

आइए नज़र:

fun succ n = Cons (n, fn() => succ (n+1)) 
val naturals = succ 0 

यह क्या उत्पादन करता है? आइए इसकी जांच करें।

naturals को succ 0 माना गया था, जो बदले में Cons(0, fn() => succ 1) होने के लिए परिभाषित किया गया है। इससे हम देख सकते हैं कि सूची में पहला तत्व 0 है।

अब हमें एक कदम आगे बढ़ने दें। हम का मूल्यांकन करते हैं, Cons का दूसरा भाग () पर, जो succ 1 उत्पन्न करता है, जो बदले में Cons(1, fn() => succ 2) है। अब हम देख सकते हैं कि सूची में दूसरा तत्व 1 है।

यदि हम इस प्रक्रिया को दोहराते हैं, तो हम पाते हैं कि सूची असीमित सूची [0, 1, 2, ...] का प्रतिनिधित्व करती है।

तुम भी

val firstnats = take 10 naturals; 

करने का प्रयास कर और आप क्या मिलता देखकर यह देख सकते हैं।

1

यह स्ट्रीम के दो निर्माताओं में से एक है। उस स्क्रीनशॉट की दूसरी पंक्ति देखें - यह सब कुछ है।