2009-08-04 18 views
12

मैं ट्विटर पर Sadek Drobi के साथ चैट कर रहा था जब एफ # असीमित प्रकार का समर्थन नहीं कर रहा था। यह पता चला सी # में आप इन पंक्तियों के साथ कुछ कर सकते हैं कि:एफ # में अनंत प्रकार (उर्फ रिकर्सिव प्रकार) संभव नहीं हैं?

delegate RecDelegate<T> RecDelegate<T>(T x); 

हालांकि, हमारे दोनों भागों पर कुछ प्रयोग के बाद, हमने तय किया एक ही एफ में # असंभव दोनों अंतर्निहित और स्पष्ट रूप से लगता है कि।

स्पष्ट:

type 'a specialF = 'a->specialF<'a> 

त्रुटि FS0191: इस प्रकार परिभाषा एक संक्षिप्त नाम के माध्यम से एक तत्काल चक्रीय संदर्भ , struct क्षेत्र या विरासत संबंध शामिल है।

अंतर्निहित:

let rec specialF (x: 'a) = specialF 

प्रकार बेमेल। 'बी - की अपेक्षा' ए -> 'बी। परिणामी प्रकार असीमित होगा जब 'बी' और '' -> 'b' को एकीकृत किया जाएगा।

बेशक, ये जानबूझकर सरल नमूने हैं।

मैं सोच रहा था कि क्या मैं किसी तरह गलत हूं। शायद मुझे कुछ प्रकार की जरूरी एनोटेशन याद आई?

+0

क्या यहां कोई व्यावहारिक अनुप्रयोग है, या सवाल सिर्फ मज़े की जांच का नतीजा था? – Brian

+1

जहां तक ​​मैं समझता हूं, वहां कोई व्यावहारिक रूप से पारदर्शी पारदर्शी अनुप्रयोग नहीं हैं। हालांकि, एक उदाहरण यह होगा कि कुछ प्रकार के बंद-ओवर परिवर्तनीय स्थिति के साथ यह बार-बार अनुप्रयोगों के लिए उपयोगी हो सकता है। पूर्व: जोड़ें (1) (2) (3) (4) - जहां कोई भी आवेदन किया जा सकता है। –

+0

यहां एक ओकैमल प्रोग्राम है जो मैंने लिखा है जो इस सुविधा का उपयोग रेक्टिप्स का उपयोग करके संकेत के स्तर से बचने के लिए करता है। http://www.ffconsultancy.com/languages/ray_tracer/code/1/ray.ml –

उत्तर

7

तुम भी है जिसके माध्यम से प्रत्यावर्तन प्रदर्शन करने के लिए एक नामित प्रकार बनाने के लिए

type 'a RecType = RecType of ('a -> 'a RecType) 

की तरह कुछ कर सकते हैं। अब यह काम करता है:

let rec specialF = RecType (fun _ -> specialF) 
+0

यदि अधिक सामान्य संस्करण काम करता है तो मुझे भी दिलचस्पी होगी: http://stackoverflow.com/questions/1253374/explicit-type -recursion-इन-च –

6
type d<'T> = delegate of 'T -> d<'T> //' 
let del : d<int> = null 
let anotherDel = del.Invoke(1).Invoke(2).Invoke(3) 

मैं तुम्हें एक नामित प्रकार है कि CLI में सीधे प्रदर्शनीय है प्रत्यावर्तन को तोड़ने के लिए है, तो एफ # में यह मतलब है कि आप एक वास्तविक प्रतिनिधि के रूप में अच्छी तरह से टाइप की जरूरत की जरूरत है।

3

रिकर्सिव रिकॉर्ड प्रकारों को भी काम करना चाहिए।

type A = { A : A } 
let rec a : A = { A = a } 

मुझे एक व्यावहारिक अनुप्रयोग में दिलचस्पी होगी। या यहां तक ​​कि एक अव्यवहारिक भी :)

संबंधित मुद्दे