2009-12-16 17 views
5

में एक पुनरावर्ती प्रकार घोषित करें मैं कुछ हास्केल कोड पोर्ट करके अपने स्वयं के F # को पढ़ाने की कोशिश कर रहा हूं।Haskell से F # - F #

data Op  = Add | Sub | Mul | Div 

data Expr = Val Int | App Op Expr Expr 

एफ # में:

Specifily मैं उलटी गिनती समस्या से पता चला here

हास्केल कोड सूचीबद्ध है here

मैं एफ # में निम्नलिखित हास्केल प्रकार बनाने के लिए कोशिश कर रहा हूँ बंदरगाह के लिए कोशिश कर रहा हूँ मुझे लगता है कि ओप टाइप को निम्नानुसार परिभाषित किया गया है:

type Op = | Add | Sub | Mul | Div 

मुझे एक्स्प्रेस प्रकार के साथ समस्याएं हैं।

कोई एक पुनरावर्ती प्रकार कैसे बनाता है? this SO question से ऐसा लगता है कि कोई F = में Expr प्रकार नहीं बना सकता है।

इसके अलावा 'एप' प्रकार के एफ # समकक्ष क्या है जो ओप प्रकार को एक्सप्र टाइप प्रकार पर लागू करता है।

यदि इस कोड को सीधे पोर्ट करना संभव नहीं है, तो कोई व्यक्ति वैकल्पिक डेटा संरचना का सुझाव दे सकता है।

उत्तर

13

इस तरह के पुनरावर्ती प्रकारों को परिभाषित करने में कोई समस्या नहीं है; आप जो नहीं कर सकते हैं वह उच्च प्रकार के प्रकार बनाते हैं, जो प्रकार के रचनाकारों पर पैरामीटरकृत होते हैं (और जिन्हें इस उदाहरण के लिए आवश्यक नहीं है)। किसी भी यूनियन प्रकार की परिभाषा के साथ, आपको कन्स्ट्रक्टर पैरामीटर से कन्स्ट्रक्टर पैरामीटर को "ऑफ" के साथ अलग करना होगा, और पैरामीटर को स्वयं को टुपल प्रकार (यानी उन्हें तारों से अलग किया जाना चाहिए) का रूप लेना चाहिए:

type Op = Add | Sub | Mul | Div 
type Expr = Val of int | App of Op * Expr * Expr 
+0

बहुत बहुत धन्यवाद! – TonyAbell

1

@kvb सही उत्तर पोस्ट किया गया।

कैसे चीजें जब आप परस्पर पुनरावर्ती प्रकार की जरूरत है करने के लिए भी

F# forward type declarations

देखें।

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