मैं एफ # में इस आलसी (अनंत?) डेटा संरचना को कैसे परिभाषित कर सकता हूं

मुझे निम्न सरल पाठ कर्सर को परिभाषित करने में समस्या आ रही है, जिसे एक टुपल द्वारा दर्शाया जाता है जहां पहला तत्व वर्तमान वर्ण होता है और दूसरा यदि कोई फ़ंक्शन जो अगले या क्रैश हो जाता है।

let rec nextAt index text = 
    if index < String.length text then
        (text.[index], (fun() -> nextAt (index + 1) text))
    else
        failwith "End of string."

मैं समझ रहा हूं

Error   1   Type mismatch. Expecting a
    char * (unit -> 'a)    
but given a
    'a    
The resulting type would be infinite when unifying ''a' and 'char * (unit -> 'a)'
0

1 उत्तर

आपको एक मध्यवर्ती प्रकार का उपयोग करना होगा:

type GetNext = GetNext of (unit -> char * GetNext)

let rec nextAt index text = 
    if index < String.length text then
        (text.[index], GetNext(fun() -> nextAt (index + 1) text))
    else
        failwith "End of string."

y combinator के बारे में यह प्रश्न इस सीमा को अधिक गहराई में और कार्यवाही के बारे में बताएं।

0
जोड़ा
@kvb, क्या आप इसका जिक्र कर रहे हैं: msdn.microsoft.com/en-us /library/dd233247.aspx ?
जोड़ा लेखक Aleksey Bykov, स्रोत
@ केवीबी: अच्छा बिंदु।
जोड़ा लेखक Daniel, स्रोत
@ 967: वह सबसे अधिक संभावना एक का जिक्र कर रहा है पावरपैक में
जोड़ा लेखक Daniel, स्रोत
यह एक अच्छा जवाब है। बेशक, यदि आप ऐसा करने जा रहे हैं, तो आप एक अपवाद फेंकने के बजाय स्ट्रिंग परिदृश्य के अंत के लिए एक और यूनियन केस भी जोड़ सकते हैं (और फिर देखो, आपने आलसी सूची प्रकार को फिर से शुरू किया है!)।
जोड़ा लेखक kvb, स्रोत
@ 967 - मेरा मतलब पावरपैक एक के साथ कुछ था, जैसा डैनियल ने अनुमान लगाया था। कुछ मामूली मतभेद हैं, हालांकि (उदाहरण के लिए PowerPack इकाई -> _ के बजाय आलसी <_> का उपयोग करता है, इसलिए परिणामों को कैश किया जाता है यदि उन्हें कई बार एक्सेस किया जाता है)। लेकिन मूल रूप से, यदि आप चाहें तो आप दूसरों के काम पर पिग-बैक कर सकते हैं, इसे स्क्रैच से पुन: कार्यान्वित करने के बजाय।
जोड़ा लेखक kvb, स्रोत