OCaml

2013-05-17 6 views
5

में पैटर्न मिलान फ़ंक्शन क्या हर कोई मुझे कोड का यह टुकड़ा समझा सकता है?OCaml

let safe_division n = function 
| 0 -> failwith "divide by 0" 
| m -> n/m 

जब मैं safeDiv 3 0 excute, क्या m और इस मामले में n है?

सामान्य स्थिति में, फ़ंक्शन पहले और दूसरे पैटर्न से मेल खाता है?

उत्तर

8

जब आप निष्पादित safe_division 3 0, पहले, 3 नाम n और घोषणा के दाएँ हाथ की ओर तो मूल्यांकन किया जाता है के लिए बाध्य है।

यह function है, इसलिए अगला तर्क, 0, क्रमशः विभिन्न मामलों के विरुद्ध मेल खाता है। यहां, यह पहले मामले से मेल खाता है, इसलिए दाएं हाथ की तरफ मूल्यांकन किया जाता है और एक अपवाद फेंक दिया जाता है। इस मामले में, नाम m कभी भी किसी भी चीज़ से बंधे नहीं है।

दूसरा तर्क था, उदाहरण के लिए, 1 के लिए, तो यह दूसरा मामला मिलते-जुलते होते हैं तो (इस मामले वैसे भी हर संभव मान से मेल खाता है, यह एक डिफ़ॉल्ट मामला है), मूल्य 1 के नाम m बाध्यकारी और फिर लौटने n/m का परिणाम।

7
let safe_division n 

एक समारोह प्रकार int है जो परिभाषित -> पूर्णांक

तो पूरी की जिसके परिणामस्वरूप प्रकार है पूर्णांक -> ...

function 
| 0 -> failwith "divide by 0" 
| m -> n/m 

एक समारोह प्रकार int है जो परिभाषित -> int -> int जहां n पहला तर्क है, और दूसरा दूसरा है। आखिरी int परिणाम है।

11

यह देखने के लिए इसका क्या मतलब है एक बार आप महसूस करते हैं कि

let f x y z = e 

के लिए

let f = function x -> function y -> function z -> e 

यही है, n तर्क के एक समारोह वास्तव में एन नेस्टेड कार्यों है बस एक छोटी हाथ है आसान है 1 तर्क का। उस प्रतिनिधित्व को "करीना" कहा जाता है। यह आपको आंशिक रूप से एक फ़ंक्शन लागू करने की अनुमति देता है, उदा।

let g = f 3 

2 तर्कों का एक कार्य देता है।

बेशक, ऊपर दिए गए छोटे हाथ को दाईं ओर स्पष्ट रूप से मिश्रित किया जा सकता है, और यही आपका उदाहरण है।

let safe_division = function n -> function 
            | 0 -> failwith "divide by 0" 
            | m -> n/m 
0
let safe_division n = function 
| 0 -> failwith "divide by 0" 
| m -> n/m 

बस के बराबर है:

let safe_division n = fun x -> match x with 
| 0 -> failwith "divide by 0" 
| m -> n/m 

नोट fun और function थोड़े अलग हैं आप इसे में desugar कर सकते हैं। देखें: http://caml.inria.fr/pub/docs/manual-ocaml/expr.html#sec121