2011-09-26 16 views
5

मैं ओकैम नोब हूं। मैं एक फ़ंक्शन में पारित तुलना ऑपरेटर को संभालने का तरीका जानने का प्रयास कर रहा हूं।ओकैम: एक तुलना ऑपरेटर का उपयोग एक समारोह में पारित

मेरा फ़ंक्शन बस एक तुलना ऑपरेटर (=, <,>, आदि) में पास करने का प्रयास करता है और एक int।

let myFunction comparison x = 
if (x (comparison) 10) then 
    10 
else 
    x;; 

मुझे उम्मीद थी कि इस कोड का मूल्यांकन होगा (अगर एक "=" में पारित किए गए):

if (x = 10) then 
    10 
else 
    x;; 

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

This expression has type 'a -> int -> bool 
but an expression was expected of type int 

मैं मैं क्या करने की कोशिश कर रहा हूँ कैसे कर सकता है?

एक तरफ सवाल, मैं इसे अपने आप कैसे समझ सकता था इसलिए मुझे किसी फोरम से बाहरी सहायता पर भरोसा नहीं करना पड़ेगा? क्या अच्छे संसाधन उपलब्ध हैं?

+0

भी ध्यान रखें कि एक बार आप इसे एक चर में है, तो आप उन्हें इनलाइन ऑपरेटर के रूप में उपयोग नहीं कर सकते। –

उत्तर

10

< और = जैसे तुलना ऑपरेटर गुप्त रूप से दो-पैरामीटर (बाइनरी) फ़ंक्शन हैं। उन्हें पैरामीटर के रूप में पास करने के लिए, आप (<) नोटेशन का उपयोग करते हैं। अपने कार्य के अंदर है कि पैरामीटर का उपयोग करने के लिए, तुम सिर्फ यह समारोह नाम के रूप में इलाज:

let myFunction comp x = 
    if comp x 10 then 
    10 
    else 
    x;; 

printf "%d" (myFunction (<) 5);; (* prints 10 *) 
+0

इंफिक्स फ़ंक्शंस बनाने के लिए यहां कुछ सीमाएं हैं जो यहां उल्लिखित हैं, http://stackoverflow.com/questions/6150551/ocaml-why-i-cant-use-this-operator-infix – nlucaroni

+0

सबसे सरल, सटीक देने के लिए स्वीकृत उपाय। –

4

OCaml आप उन्हें कोष्ठक में बंद करके पहचानकर्ता के रूप में इन्फ़िक्स ऑपरेटरों के इलाज के लिए अनुमति देता है। यह न केवल मौजूदा ऑपरेटरों के लिए बल्कि नए लोगों के लिए काम करता है जिन्हें आप परिभाषित करना चाहते हैं। वे फ़ंक्शन नाम या पैरामीटर के रूप में भी दिखाई दे सकते हैं। उन्हें प्रतीक पात्रों को शामिल करना होता है, और उन्हें उनके पहले चरित्र से जुड़ी प्राथमिकता दी जाती है। तो अगर आप वास्तव में चाहते थे, आप myFunction की तुलना पैरामीटर के लिए इन्फ़िक्स संकेतन का उपयोग कर सकते हैं:

 Objective Caml version 3.12.0 
# let myFunction (@) x = 
     x @ 10;; 
val myFunction : ('a -> int -> 'b) -> 'a -> 'b = <fun> 
# myFunction (<) 5;; 
- : bool = true 
# myFunction (<) 11;; 
- : bool = false 
# myFunction (=) 10;; 
- : bool = true 
# myFunction (+) 14;; 
- : int = 24 
# 

(यह स्पष्ट नहीं कर रहा है यह पढ़ने के लिए myFunction बनाता है किसी भी आसान मुझे लगता है कि नए इन्फ़िक्स ऑपरेटरों की परिभाषा किफ़ायत से किया जाना चाहिए।।

https://stackoverflow.com/questions/2073436/ocaml-resources

012:)

अपनी तरफ सवाल का जवाब करने के लिए, OCaml संसाधनों की बहुत सारी इस अन्य StackOverflow पृष्ठ पर सूचीबद्ध हैं

2

कई संभावनाएं:

उपयोग एक नई परिभाषा अपनी तुलना ऑपरेटर को फिर से परिभाषित करने के लिए:

let myFunction comparison x = 
    let (@) x y = comparison x y in 
    if (x @ 10) then 
    10 
    else 
    x;; 

तुम भी अतिरिक्त परिभाषा के बिना @ गुजारें सकता सीधे।

एक और समाधान के रूप में आप कुछ सहायक कार्यों का उपयोग कर सकते हैं कि तुम क्या जरूरत है परिभाषित करने के लिए:

let (/*) x f = f x 
let (*/) f x = f x 

let myFunction comparison x = 
    if x /* comparison */ 10 then 
    10 
    else 
    x 
+0

एक और नोट: इसके लिए परिभाषित सहायक सहायक कार्य पहले से ही उपलब्ध है यदि आप बैटरी का उपयोग करते हैं |> और <| BatStd मॉड्यूल में। सभी बैटरी में अक्सर आपके जीवन को ऐसे कार्यों के लिए बहुत आसान बनाता है। – LiKao

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