यदि मैं उच्च आदेश फ़ंक्शन के लिए (मुझे लगता है) सही प्रकार निर्दिष्ट करता है तो ओकैमल कंपाइलर दूसरा उस फ़ंक्शन का उपयोग अस्वीकार करता है।उच्च ऑर्डर फ़ंक्शन का प्रकार
कोड
let foo():string =
let f: ('a -> string) -> 'a -> string = fun g v -> g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x^y
निम्न त्रुटि संदेश
File "test.ml", line 6, characters 14-15: Error: This expression has type float -> string but an expression was expected of type int -> string
तो f
का सर्वप्रथम प्रयोग int -> string
करने के लिए अपने पहले पैरामीटर के प्रकार को ठीक करने लगता है की ओर जाता है। मैं इसे समझ सकता था। लेकिन मुझे यह नहीं मिला कि f
पर प्रकार प्रतिबंध को छोड़कर समस्या ठीक हो जाती है।
let foo():string =
let f g v = g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x^y
और आगे बढ़ f
वैश्विक विस्तार के लिए समस्या है, भी ठीक करता है:
let f: ('a -> string) -> 'a -> string = fun g v -> g v
let foo():string =
let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x^y
क्यों कि पहला उदाहरण बाद में लोगों को करना है, जबकि संकलन नहीं है कि यह कर रहा है?
मैं आपके प्रश्न से चिपक गया हूं, लेकिन एक टिप्पणी जो मैं कर सकता हूं वह है कि 'च f (g:' a-> string) (v: 'a): string = gv' जो भी आप चाहते हैं वह नहीं करता है: ' दो प्रकार की टिप्पणियों में 'ए' समान नहीं है। यदि आप 'जी' और '' v' वही 'ए' के साथ। –
मैं इसे ओकैमल मेलिंग सूची में पोस्ट करने की अनुशंसा करता हूं। –
@ पास्कल: धन्यवाद, मैंने प्रश्न – copton