ফাংশন প্যারামিটারগুলি কেন টীকা দেয় না?


28

এই প্রশ্নের জবাবদিহি করতে, ধরে নেওয়া যাক যে কোনও প্রোগ্রামারের মনে অস্পষ্টতার জন্য ব্যয় আরও কয়েকটি ব্যয়বহুল কিছু ব্যয়বহুল।

এটি দেওয়া, কেন আমি আমার সতীর্থদের তাদের ফাংশনগুলির পরামিতিগুলি বর্ননা না করে পালিয়ে যেতে দেব ? কোডের থেকে আরও জটিল অংশটি কী হতে পারে তার উদাহরণ হিসাবে নীচের কোডটি ধরুন:

let foo x y = x + y

এখন, সরঞ্জামদণ্ডের একটি দ্রুত পরীক্ষা আপনাকে দেখাবে যে এফ # আপনাকে নির্ধারণ করেছে যে আপনি x এবং y এর জন্য অন্তর্নিহিত হবেন। যদি আপনি যা ইচ্ছা করেন, তবে সব ঠিক আছে। তবে আমি জানি না এটি আপনার উদ্দেশ্য কী ছিল। আপনি যদি এই কোডটি দুটি স্ট্রিং একসাথে সংযুক্ত করার জন্য তৈরি করে থাকেন? বা যদি আমি মনে করি আপনি সম্ভবত ডাবলস যুক্ত করতে চান? বা যদি আমি কেবল প্রতিটি একক ফাংশন প্যারামিটারের ধরণটি নির্ধারণ করতে চাই না তবে কি হবে?

এখন এটি উদাহরণ হিসাবে নিন:

let foo x y = "result: " + x + y

এফ # এখন ধরে নিয়েছে আপনি সম্ভবত স্ট্রিংগুলি একত্রিত করার উদ্দেশ্যে করেছেন, তাই x এবং y স্ট্রিং হিসাবে সংজ্ঞায়িত হয়েছে। যাইহোক, আপনার কোডটি রক্ষণাবেক্ষণকারী দরিদ্র লোকেরা হিসাবে আমি এই দিকে তাকিয়ে ভাবতে পারি যে সম্ভবত আপনি যদি x এবং y (ints) একসাথে যুক্ত করার সিদ্ধান্ত নিয়েছিলেন এবং তারপরে ফলাফলটি ইউআই উদ্দেশ্যে যুক্ত করতে চান।

অবশ্যই এই জাতীয় সরল উদাহরণগুলির জন্য কেউ এটিকে ছেড়ে দিতে পারে, তবে কেন স্পষ্টত ধরণের টীকা নীতি প্রয়োগ করে না?

let foo (x:string) (y:string) = "result: " + x + y

দ্ব্যর্থহীন হওয়ার কী ক্ষতি? অবশ্যই, কোনও প্রোগ্রামার তারা যা করার চেষ্টা করছে তার জন্য ভুল ধরণেরগুলি বেছে নিতে পারে, তবে কমপক্ষে আমি জানি তারা এটি উদ্দেশ্য করে নিয়েছিল, এটি কেবল একটি তদারকি ছিল না।

এটি একটি গুরুতর প্রশ্ন ... আমি এখনও এফ # তে খুব নতুন এবং আমার সংস্থার জন্য ট্রেইল জ্বলছি। আমি যে স্ট্যান্ডার্ডগুলি গ্রহণ করি তা হ'ল ভবিষ্যতের সমস্ত # # কোডিংয়ের ভিত্তি, অন্তহীন অনুলিপি-পেস্টিংয়ের মধ্যে এম্বেড করা যে আমি নিশ্চিত যে আগাম কয়েক বছর ধরে সংস্কৃতিটি বয়ে বেড়াবে।

সুতরাং ... এফ # এর ধরণের অনুমান সম্পর্কে বিশেষ কিছু রয়েছে যা কেবল প্রয়োজন হলে টীকাগুলি ধরে রাখা এটি একটি মূল্যবান বৈশিষ্ট্য করে তোলে? অথবা বিশেষজ্ঞ এফ #- এর লোকেরা নন-তুচ্ছ অ্যাপ্লিকেশনগুলির জন্য তাদের পরামিতিগুলি বর্ননা করার অভ্যাস তৈরি করে?


টীকাযুক্ত সংস্করণটি কম সাধারণ। এটি একই কারণে আপনি পছন্দসই আইওনামেবল <> স্বাক্ষরগুলিতে ব্যবহার করেন এবং সাজ্টসেট <> নয়।
প্যাট্রিক

2
@ পেট্রিক - না, এটি নয়, কারণ এফ # স্ট্রিংয়ের ধরণের অনুমান করছে। আমি ফাংশনের স্বাক্ষরটি পরিবর্তন করি নি, কেবল এটি স্পষ্ট করে তুলেছি।
জেডিবি

1
@ পেট্রিক - এবং এটি সত্য হলেও আপনি কি ব্যাখ্যা করতে পারেন যে এটি কেন খারাপ জিনিস? সম্ভবত যদি স্বাক্ষরটি কম সাধারণ হওয়া উচিত তবে যদি প্রোগ্রামারটি এটাই বলেছিল। সম্ভবত আরও সাধারণ স্বাক্ষর আসলে সমস্যা সৃষ্টি করছে, তবে আমি নিশ্চিত নই যে প্রোগ্রামার প্রচুর পরিমাণে গবেষণা ছাড়াই কতটা সুনির্দিষ্ট হতে চেয়েছিলেন।
জেডিবি

1
আমি মনে করি এটি কার্যকরভাবে বলা যায় যে, কার্যকরী ভাষাগুলিতে আপনি সাধারণতাকে প্রাধান্য দেন এবং আরও সুনির্দিষ্ট ক্ষেত্রে মন্তব্য করেন; যেমন আপনি যখন আরও ভাল পারফরম্যান্স চান এবং এটি টাইপ হিন্টিং ব্যবহার করে তা পেতে পারেন। যেকোন জায়গায় টীকাযুক্ত ফাংশন ব্যবহার করার জন্য আপনাকে প্রতিটি নির্দিষ্ট ধরণের জন্য ওভারলোডগুলি লিখতে হবে যা সাধারণ ক্ষেত্রে সতর্কিত নয়।
রবার্ট হার্ভে

উত্তর:


30

আমি এফ # ব্যবহার করি না, তবে হাস্কেলের এটিকে উচ্চ-স্তরের সংজ্ঞা এবং কমপক্ষে স্থানীয় সংজ্ঞাগুলি বর্ণনার জন্য ভাল ফর্ম হিসাবে বিবেচনা করা হয়, যদিও ভাষার প্রচলিত ধরণের অনুমান রয়েছে। এটি কয়েকটি কারণে:

  • পঠন
    যখন আপনি কোনও ফাংশনটি কীভাবে ব্যবহার করতে চান তা জানতে চাইলে টাইপ স্বাক্ষরটি পাওয়া অবিশ্বাস্যভাবে কার্যকর। আপনি নিজেরাই এটি অনুমান করার চেষ্টা করা বা এটি করার জন্য সরঞ্জামগুলিতে নির্ভর করার চেয়ে আপনি কেবল এটি পড়তে পারেন।

  • রিফ্যাক্টরিং
    আপনি যখন কোনও ফাংশন পরিবর্তন করতে চান, একটি স্পষ্ট স্বাক্ষর থাকা আপনাকে কিছুটা আশ্বাস দেয় যে আপনার রূপান্তরগুলি আসল কোডের অভিপ্রায়ে সংরক্ষণ করে। একটি টাইপ-অনুমানকৃত ভাষায়, আপনি দেখতে পাবেন যে উচ্চ পলিমারফিক কোডটি টাইপচেক করবে তবে আপনি যা চান তা করবে না। প্রকারের স্বাক্ষরটি একটি "বাধা" যা ইন্টারফেসে টাইপ তথ্যকে একত্র করে।

  • পারফরম্যান্স
    হাস্কেলে, কোনও ফাংশনের ইনফেরার্ড প্রকারটি ওভারলোড করা হতে পারে (টাইপক্লাসগুলির মাধ্যমে), যা রানটাইম প্রেরণকে বোঝায়। সংখ্যার ধরণের জন্য, ডিফল্ট টাইপটি একটি স্বেচ্ছাসেবী-নির্ভুলতা পূর্ণসংখ্যা হয়। আপনার যদি এই বৈশিষ্ট্যগুলির পূর্ণ সাধারণতার প্রয়োজন না হয়, তবে আপনার প্রয়োজনীয় ধরণের ক্ষেত্রে ফাংশনটি বিশেষায়িত করে আপনি কার্য সম্পাদন করতে পারেন।

স্থানীয় সংজ্ঞা, let-বাউন্ড ভেরিয়েবল এবং ল্যাম্বডাসের আনুষ্ঠানিক পরামিতিগুলির জন্য, আমি দেখতে পাই যে টাইপ স্বাক্ষরগুলির সাধারণত কোডে তারা যুক্ত করা মানের চেয়ে বেশি খরচ হয়। কোড পর্যালোচনাতে, আমি আপনাকে শীর্ষ-স্তরের সংজ্ঞাগুলির জন্য স্বাক্ষরগুলিতে জোর দেওয়ার পরামর্শ দিচ্ছি এবং কেবল অন্য কোথাও বিচার্য মন্তব্যগুলির জন্য বলব ।


3
এটি খুব যুক্তিসঙ্গত এবং সু-ভারসাম্য প্রতিক্রিয়া বলে মনে হচ্ছে।
জেডিবি

1
আমি সম্মত হই যে প্রকারের সাথে স্পষ্টভাবে সংজ্ঞায়িত সংজ্ঞাটি রিফ্যাক্টরিং করার সময় সহায়তা করতে পারে তবে আমি দেখতে পাই যে ইউনিট পরীক্ষাটিও এই সমস্যার সমাধান করতে পারে এবং কারণ আমি বিশ্বাস করি যে ইউনিট পরীক্ষাটি ব্যবহারের পূর্বে নকশাকৃত ফাংশনটি নিশ্চিত করার জন্য কার্যকরী প্রোগ্রামিংয়ের সাথে ব্যবহার করা উচিত অন্য ফাংশনটির সাথে ফাংশন করুন, এটি আমাকে ধরণের সংজ্ঞাটি ছাড়তে এবং আত্মবিশ্বাসের অনুমতি দেয় যে আমি কোনও ব্রেকিং পরিবর্তন করলে এটি ধরা পড়বে। উদাহরণ
গাই কোডার

4
হাস্কেলের ক্ষেত্রে এটি আপনার ফাংশনগুলি বর্ননা করা সঠিক বলে বিবেচিত হয় তবে আমি বিশ্বাস করি যে অভিব্যক্তিক F # এবং OCaml অস্পষ্টতা অপসারণ করার প্রয়োজন না হলে টীকা বাদ দেয়। এটি ক্ষতিকারক বলে মনে হয় না (যদিও এফ # তে টীকা দেওয়ার জন্য সিনট্যাক্স হাস্কেলের চেয়ে খারাপ)।
কেচালাক্স

4
@ কেচালাক্স ওক্যামল-এ ইতিমধ্যে ইন্টারফেস ( .mli) ফাইলে এনোটেশনগুলি টাইপ করা আছে (যদি আপনি একটি লিখে থাকেন তবে আপনাকে দৃ strongly়ভাবে উত্সাহ দেওয়া হয়েছে। টাইপ টীকাগুলি সংজ্ঞা থেকে বাদ দেওয়া যায় কারণ এগুলি ইন্টারফেসের সাথে অপ্রয়োজনীয় হতে পারে।
গিলস ' তাই খারাপ হওয়া বন্ধ করুন '

1
@Gilles প্রকৃতপক্ষে @KChaloux এফ # স্বাক্ষরে একই ( .fsiএক সতর্কীকরণ সঙ্গে,) ফাইল: ফল # টাইপ অনুমান জন্য স্বাক্ষর ফাইল ব্যবহার করে না, তাই যদি বাস্তবায়ন কিছু দ্ব্যর্থক হয়, তাহলে আপনি পাবেন এখনও আবার টীকা করতে হবে। books.google.ca/…
ইয়াওর আমিন

1

জন একটি যুক্তিসঙ্গত উত্তর দিয়েছেন যা আমি এখানে পুনরায় বলব না। তবে আমি আপনাকে এমন একটি বিকল্প দেখাব যা আপনার প্রয়োজনগুলি পূরণ করতে পারে এবং প্রক্রিয়াটিতে আপনি হ্যাঁ / না বাদে অন্য ধরণের উত্তর দেখতে পাবেন।

ইদানীং আমি পার্সার কম্বিনেটর ব্যবহার করে পার্সিংয়ের সাথে কাজ করছি। আপনি যদি পার্সিং জানেন তবে আপনি জানেন যে আপনি সাধারণত প্রথম পর্যায়ে একটি লেসার এবং দ্বিতীয় পর্বে পার্সার ব্যবহার করেন। লেক্সার পাঠ্যটিকে টোকনে রূপান্তর করে এবং পার্সার টোকেনকে একটি এএসটিতে রূপান্তর করে। এখন এফ # একটি কার্যকরী ভাষা এবং সংযোজকগুলি সংযুক্ত করার জন্য ডিজাইন করা হচ্ছে, পার্সার কম্বিনেটরগুলি লেসার এবং পার্সার উভয় ক্ষেত্রে একই ফাংশন ব্যবহার করার জন্য ডিজাইন করা হয়েছে তবে আপনি যদি পার্সার সংযুক্তকারী ফাংশনগুলির জন্য টাইপ সেট করেন তবে আপনি কেবল সেগুলি ব্যবহার করতে পারবেন লেক্স বা পার্স এবং উভয় না।

উদাহরণ স্বরূপ:

/// Parser that requires a specific item.

// a (tok : 'a) : ('a list -> 'a * 'a list)                     // generic
// a (tok : string) : (string list -> string * string list)     // string
// a (tok : token)  : (token list  -> token  * token list)      // token

অথবা

/// Parses iterated left-associated binary operator.


// leftbin (prs : 'a -> 'b * 'c) (sep : 'c -> 'd * 'a) (cons : 'd -> 'b -> 'b -> 'b) (err : string) : ('a -> 'b * 'c)                                                                                    // generic
// leftbin (prs : string list -> string * string list) (sep : string list -> string * string list) (cons : string -> string -> string -> string) (err : string) : (string list -> string * string list)  // string
// leftbin (prs : token list  -> token  * token list)  (sep : token list  -> token  * token list)  (cons : token  -> token  -> token  -> token)  (err : string) : (token list  -> token  * token list)   // token

কোডটি কপিরাইট হওয়ায় আমি এটিকে এখানে অন্তর্ভুক্ত করব না তবে এটি গিথুবে উপলভ্য । এটি এখানে অনুলিপি করবেন না।

ফাংশনগুলি কাজ করার জন্য তাদের অবশ্যই জেনেরিক পরামিতিগুলি রেখে দেওয়া উচিত, তবে আমি এমন মন্তব্যগুলি অন্তর্ভুক্ত করেছি যা কার্যকারিতা ব্যবহারের উপর নির্ভর করে অনুমানযুক্ত প্রকারগুলি দেখায়। এটি ব্যবহারের জন্য জেনেরিকটি রেখে যাওয়ার সময় রক্ষণাবেক্ষণের জন্য ফাংশনটি বোঝা সহজ করে তোলে।


1
আপনি কেন জেনেরিক সংস্করণটি ফাংশনে লিখবেন না? কাজ হবে না?
সুইভ

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

কোডটি কাজ করার পরে আমি যেভাবে মন্তব্যগুলিকে সবার জন্য মন্তব্য হিসাবে কাজ করেছি তা দীর্ঘমেয়াদে। আমি যখন কোনও ফাংশন লিখতে শুরু করি তখন টাইপগুলি লিখি। আমার ফাংশনটি একবার কাজ করার পরে, আমি টাইপ স্বাক্ষরটি একটি মন্তব্যে সরিয়ে নিয়েছি এবং যতগুলি সম্ভব সম্ভব প্রকারগুলি সরিয়ে ফেলি। কিছু সময় এফ # এর সাথে আপনাকে ইনফারেন্সিং সহায়তা করতে টাইপ ছেড়ে চলে যেতে হবে। কিছুক্ষণের জন্য আমি লেট এবং = এর সাথে মন্তব্য তৈরি করার জন্য পরীক্ষা করছিলাম যাতে আপনি পরীক্ষার জন্য লাইনটিকে অসুবিধে করতে পারেন, তারপরে এটি করার পরে আবার মন্তব্য করুন, তবে তারা নির্বোধ বলে মনে হয়েছে এবং একটি লেট এবং = যুক্ত করা খুব কঠিন নয়।
গাই কোডার

যদি এই মন্তব্যগুলি আপনি যা জিজ্ঞাসা করছেন তার উত্তর যদি আমাকে দেয় তবে আমি সেগুলিকে উত্তরে স্থান দিতে পারি।
গাই কোডার

2
সুতরাং আপনি যখন কোডটি সংশোধন করবেন, আপনি মন্তব্যগুলি সংশোধন করবেন না, পুরানো ডকুমেন্টেশনের দিকে পরিচালিত করে? এটি আমার পক্ষে সুবিধার মতো শোনাচ্ছে না। এবং আমি সত্যিই দেখছি না যে অগোছালো মন্তব্য মেসডি কোডের চেয়ে আরও ভাল। আমার কাছে মনে হচ্ছে এই পদ্ধতির দুটি বিকল্পের অসুবিধাগুলির সংমিশ্রণ রয়েছে।
সুইভ

-8

বাগের সংখ্যা সরাসরি কোনও প্রোগ্রামের অক্ষরের সংখ্যার সাথে সমানুপাতিক!

কোডের লাইনের সাথে আনুপাতিক বাগের সংখ্যা হিসাবে এটি সাধারণত বলা হয়। তবে একই পরিমাণের কোডের সাথে কম লাইন থাকা একই পরিমাণ বাগগুলি দেয়।

সুতরাং এটি স্পষ্ট করে বলতে খুব সুন্দর, আপনার টাইপ করা কোনও অতিরিক্ত পরামিতি বাগের দিকে নিয়ে যেতে পারে।


5
"বাগের সংখ্যা একটি প্রোগ্রামের অক্ষরের সংখ্যার সাথে সরাসরি সমানুপাতিক!" সুতরাং আমাদের সকলকে কি এপিএলে স্যুইচ করা উচিত ? অত্যধিক ভারসাম্যহীন হওয়া ঠিক যেমন খুব ভার্জোজ হওয়ার মতো সমস্যা।
সুইভ

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