এফ # সুস্পষ্ট মিল বনাম ফাংশন সিনট্যাক্স


90

অস্পষ্ট শিরোনাম সম্পর্কে দুঃখিত, তবে এই প্রশ্নের দুটি অংশই এই দুটি সিনট্যাক্স স্টাইলকে বলা হয়:

let foo1 x = 
    match x with
    | 1 -> "one"
    | _ -> "not one"

let foo2 = function 
    | 1 -> "one" 
    | _ -> "not one"

অন্য অংশটি হ'ল উভয়ের মধ্যে তফাত কী আছে এবং আমি যখন একটি বা অন্যটি ব্যবহার করতে চাই?

উত্তর:


58

ম্যাচের সংস্করণটিকে "প্যাটার্ন ম্যাচিং এক্সপ্রেশন" বলা হয়। ফাংশন সংস্করণটিকে "প্যাটার্ন ম্যাচিং ফাংশন" বলা হয়। বিভাগে 6.6.4 পাওয়া বৈশিষ্ট

একে অপরকে ব্যবহার করা শৈলীর বিষয়। আমি কেবল তখনই ফাংশন সংস্করণটি ব্যবহার করতে পছন্দ করি যখন আমাকে কোনও ফাংশন সংজ্ঞায়িত করতে হবে যা কেবল একটি ম্যাচের বিবৃতি।


ধন্যবাদ. যদিও এফ # ব্যবহার করে ফাংশনাল প্রোগ্রামিংটি বলেছেন যে ফাংশন কীওয়ার্ডের ব্যবহারটি এটি একটি প্যাটার্ন মেলানো ফাংশন নির্দেশ করে, এই উত্তর এবং ওপি একটি মস্তিষ্কের আটকে থাকা মুহুর্তটি স্পষ্ট করে।
অক্টোপাসগ্র্যাববাস

লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে।
ম্যাটএমএস

84

দ্বিতীয় সিনট্যাক্সের পক্ষে প্রোটি হ'ল ল্যাম্বডায় যখন ব্যবহার করা হয় তখন এটি কিছুটা পরিশ্রুত ও পঠনযোগ্য হতে পারে।

List.map (fun x -> match x with | 1 -> "one" | _ -> "not one") [0;1;2;3;1]

বনাম

List.map (function 1 -> "one" | _ -> "not one") [0;1;2;3;1]

23

বিশেষ ক্ষেত্রে পুরো ম্যাচ সিনট্যাক্সের জন্য ফাংশন সংস্করণটি একটি সংক্ষিপ্ত হাত যেখানে ম্যাচের বিবৃতিটি সম্পূর্ণ ফাংশন এবং ফাংশনটিতে কেবল একটি যুক্তি থাকে (এক হিসাবে গণনা)। আপনি যদি দুটি যুক্তি রাখতে চান তবে আপনার সম্পূর্ণ ম্যাচ সিনট্যাক্স ব্যবহার করা দরকার। আপনি নিম্নলিখিত দুটি ফাংশনের প্রকারে এটি দেখতে পারেন।

//val match_test : string -> string -> string
let match_test x y = match x, y with
                        | "A", _ -> "Hello A"
                        | _, "B" -> "Hello B"
                        | _ -> "Hello ??"

//val function_test : string * string -> string                   
let function_test = function
                        | "A", _ -> "Hello A"
                        | _, "B" -> "Hello B"
                        | _ -> "Hello ??"

আপনি দেখতে পাচ্ছেন ম্যাচের সংস্করণটি দুটি পৃথক আর্গুমেন্ট নেয় যখন ফাংশন সংস্করণটি একটি একক দ্বিখণ্ডিত যুক্তি নেয় takes আমি বেশিরভাগ একক আর্গুমেন্ট ফাংশনগুলির জন্য ফাংশন সংস্করণটি ব্যবহার করি যেহেতু আমি ফাংশন সিনট্যাক্সটিকে আরও পরিষ্কার দেখাচ্ছে।

* আপনি যদি সত্যিই চাইতেন তবে সঠিক ধরণের স্বাক্ষর রাখতে আপনি ফাংশন সংস্করণটি পেতে পারেন তবে এটি আমার মতে বেশ কুৎসিত দেখাচ্ছে - নীচের উদাহরণটি দেখুন।

//val function_match_equivalent : string -> string -> string
let function_match_equivalent x y = (x, y) |> function
                                                | "A", _ -> "Hello A"
                                                | _, "B" -> "Hello B"
                                                | _ -> "Hello ??"

12

আপনার ক্ষেত্রেও তারা একই কাজ করে - functionকীওয়ার্ডটি কীওয়ার্ডের সংমিশ্রণের মতো কাজ করে fun(একটি বেনাম ল্যাম্বদা তৈরি করতে) মূল matchশব্দটি অনুসরণ করে ।

সুতরাং প্রযুক্তিগতভাবে এই দুটি যুক্ত হওয়ার সাথে একটি fun:

let foo1 = fun x ->
    match x with
    | 1 -> "one"
    | _ -> "not one"

let foo2 = function
    | 1 -> "one"
    | _ -> "not one"

4
এটি আসলে অন্যভাবে নয় - অর্থাত funপ্রযুক্তিগতভাবে কী সংজ্ঞায়িত হয় function | _ -> ...?
পাভেল মিনায়েভ

4
নির্দিষ্ট করা, fun x y -> ...হতে হবে fun x -> fun y -> ..., এবং তারপর fun x -> ...হবে function | x -> ...। এজন্য আপনি প্যাটার্ন ম্যাচিং করতে পারেন fun- যেমন fun (x::xs) -> ...
পাভেল মিনায়েভ

10

কেবল সম্পূর্ণতার জন্য, আমি বিশেষজ্ঞ এফশার্পের 321 পৃষ্ঠায় পেয়েছি :

"দ্রষ্টব্য, তালিকাভুক্ত 12-2 টি প্রকাশের ফর্মটি ব্যবহার করে function pattern-rules -> expressionThis এটি (fun x -> match x with pattern-rules -> expression)বৈষম্যমূলক ইউনিয়নগুলির সাথে সরাসরি কাজ করে ফাংশনগুলি সংজ্ঞায়িত করার উপায় হিসাবে সমান এবং বিশেষত সুবিধাজনক।"


6

ফাংশনটি কেবল একটি যুক্তির জন্য অনুমতি দেয় তবে প্যাটার্ন ম্যাচিংয়ের জন্য মঞ্জুরি দেয়, অন্যদিকে মজাদার একটি ফাংশন সংজ্ঞায়িত করার আরও সাধারণ এবং নমনীয় উপায়। এখানে একবার দেখুন: http://caml.inria.fr/pub/docs/manual-ocaml/expr.html


আপনি কেবলমাত্র শেষ যুক্তির পরিবর্তে 1 টি যুক্তি কেন বলছেন? 1 টির বেশি যুক্তি থাকা এবং "ফাংশন" ব্যবহার করা সম্ভব। এটি কি কোনও উচ্চতর ক্রমের ব্যাখ্যা?
প্রতীক

4

দুটি বাক্য গঠন সমান। বেশিরভাগ প্রোগ্রামাররা একে অপরকে বেছে নেয় এবং তারপরে এটি ধারাবাহিকভাবে ব্যবহার করে।

ফাংশনটি কাজ শুরু করার আগে বেশ কয়েকটি যুক্তি স্বীকার করলে প্রথম বাক্য গঠন আরও পঠিত থাকে।


2

এটি একটি পুরানো প্রশ্ন তবে আমি আমার 0.02 ডলার নিক্ষেপ করব।

matchপাইথনের পৃথিবী থেকে যেহেতু আমি "স্পষ্টিকর বর্ণনামূলক চেয়ে আরও ভাল" general

অবশ্যই যদি প্যারামিটারে টাইপ তথ্য প্রয়োজন হয় তবে functionসংস্করণটি ব্যবহার করা যাবে না।

OTOH আমি যুক্তিটি পছন্দ করি Stringerতাই আমি functionসহজ ল্যাম্বডাসে ব্যবহার শুরু করব ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.