ক্রিয়ামূলক প্রোগ্রামিং কি অন্যরকম, বা এটি আসলেই আরও শক্ত?


12

ক্রিয়ামূলক প্রোগ্রামিং কি অন্যরকম , বা এটি আসলেই আরও শক্ত ?

এমন কাউকে বলুন যিনি এর আগে কখনও প্রোগ্রামিং শিখেনি, এবং কার্যকরী প্রোগ্রামিং শেখানো হয়। বনাম এমন কেউ যিনি এর আগে কখনও প্রোগ্রামিং শিখেননি, এবং জরুরী প্রোগ্রামিং শেখানো হয়। কোনটি তাকে আরও কঠিন মনে হবে? নাকি একই?

আমার প্রশ্ন: এখন বলুন সমস্যাটি উটের ক্ষেত্রে একটি ইনপুট,

যেমন qwe_asd_zxc_rty_fgh_vbnহয়ে যায়qweAsdZxcRtyFghVbn

পদ্ধতিগত উপায় হ'ল:

  1. এটি বরাবর বিভক্ত _
  2. অ্যারের মাধ্যমে লুপ প্রথম আইটেম এড়ানো
  3. প্রতিটি প্রবেশের জন্য আমরা প্রথম অক্ষরকে মূলধন করি
  4. একসাথে ফলাফল যোগদান

কার্যকরী উপায় হ'ল:

  1. যদি _ফিরে না পাওয়া যায়input
  2. inputপ্রথমটি বরাবর কাটা _(যেমন আমরা পাই qweএবং asd_zxc_rty_gfh_cvb)
  3. প্রথম অক্ষরকে মূলধন করুন headএবং এর সাথে একমত হনf(tail)

ঠিক আছে যদি আপনার কার্যকরী-পটভূমি থাকে এবং পদ্ধতিগত-প্রোগ্রামিংয়ে যথেষ্ট অভিজ্ঞতা থাকে তবে আমি জিজ্ঞাসা করতে চাই: প্রক্রিয়াগত উপায়টি বের করতে আপনার কি বেশি সময় লাগবে বা কার্যকরী উপায়টি বের করতে আপনার আরও বেশি সময় লাগবে?

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


5
এহরাম, "পদ্ধতিগত উপায়" আমার কাছে পুরোপুরি কার্যকরী বলে মনে হয় যদি আমরা কোনও মিউটিং মিটিং mapলুপের পরিবর্তে ৩ য় ধাপের জন্য ব্যবহার করি । দ্বিতীয় পদ্ধতির এমন কিছু যা আমি কেবল বিবেচনা করব যদি স্ট্যান্ডার্ড লাইব্রেরিতে কোনও বিভাজন ফাংশন না থাকে (এই ক্ষেত্রে এটি একটি অত্যাবশ্যক সমাধানের সাথে তুলনা করা উচিত যা এটি ব্যবহার করে না split)।
sepp2k

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

আমি মনে করি না যে কার্যকরী প্রোগ্রামিং শক্ত, এটি অন্যরকম। আপনার যদি কোনও প্রোগ্রামিংয়ের অভিজ্ঞতা না হয় তবে শেখা ঠিক তত সহজ, তবে কোনও কারণে আপনি অত্যাবশ্যক প্রোগ্রামিং শিখলে, কার্যকরী প্রোগ্রামিং কঠিন হয়ে যায়।
ড্যান_ওয়াটারওয়ার্থ

1
আমি মনে করি ফাংশনাল এবং পদ্ধতিগত মধ্যে পার্থক্য মোট হয়ে যায়, যেহেতু জাভাস্ক্রিপ্ট, সি #, গ্রোভির মতো মূল স্ট্রিমের ভাষায় আরও বেশি কার্যকরী বৈশিষ্ট্য রয়েছে।
ব্যবহারকারী 281377

2
পূর্ববর্তী প্রোগ্রামিংয়ের অভিজ্ঞতা যাদের ছিল না তাদের পক্ষে ইমপিরিটিভ প্রোগ্রামিং অনেক বেশি কঠিন এবং পাল্টা স্বজ্ঞাত। মত একটি অভিব্যক্তি x=x+1একটি অপ্রত্যাশিত মস্তিষ্ক উড়ে যেতে পারে। ফাংশনাল প্রোগ্রামিং প্রাকৃতিক, এটি খাঁটি এবং দৃ .়ভাবে গণিতের কার্যকারিতা ছাড়া আর কিছুই নয়।
এসকে-যুক্তি

উত্তর:


12

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

নতুনদের কাছে এটি প্রায়শই স্বজ্ঞাত যে আপনি কেবল কোনও কিছুর মান পরিবর্তন করতে পারবেন না ।

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


জাল্ফ আপনি কি প্রোগ্রামিংয়ে নতুন এমন একজন এবং এটিকে মোটামুটি সহজেই তুলেছেন?
পেসারিয়ার

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

অপরিবর্তনীয় ভেরিয়েবল? গণিত কি কার্যকরী প্রোগ্রামিং ভাষা নয়? গণিতে ভেরিয়েবলগুলি অবশ্যই পরিবর্তনযোগ্য, না?
user56834

20

এটা ঠিক অন্যরকম

যখন আপনি প্রোগ্রাম করেন আপনি মূলত আপনার কোডের কারণ হিসাবে অনুবাদ করেন তখন আপনার চিন্তাভাবনা এবং চূড়ান্ত সমাধানের মধ্যে দূরত্বটিকে "জ্ঞানীয় ব্যবধান" বলা যেতে পারে। এটিকে পূরণ করতে আপনার পক্ষে যত বড় ব্যবধান তত বেশি কঠিন।

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

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

কার্যকরী এবং পদ্ধতিগতভাবে যাইহোক সুন্দর তরল ধারণা এবং এগুলি ওভারল্যাপে ঝোঁক


4

হ্যাঁ, ফাংশনাল প্রোগ্রামিং অনেকের পক্ষে উপলব্ধি করা কঠিন হয়ে পড়ে (আমি বলতে চাই, বিশেষত যারা ইতিমধ্যে প্রক্রিয়াজাত প্রোগ্রামিংয়ের সংস্পর্শে এসেছিলেন)।

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

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

প্রচুর ভাষাগুলি এটিকে সমর্থন করে তবে এগুলি করার জন্য তাদের প্রয়োজন যে আমরা নিয়মিত অভিব্যক্তির মতো কিছু হিসাবে প্যাটার্নটি নির্দিষ্ট করি। তবে নিয়মিত প্রকাশগুলি বিশেষ-উদ্দেশ্যে প্রোগ্রামিং ভাষার চেয়ে কম বা কম কিছুই নয় এবং একটি আরই বাস্তবায়ন সেই ভাষার সংকলক এবং / অথবা দোভাষী। আরই কে সংকলনের ফলাফলটি মূলত এমন একটি ফাংশন যা কিছু ইনপুটটির বিপরীতে অভিব্যক্তিটি মেলানোর জন্য (একটি বিশেষ আরআর ভার্চুয়াল মেশিনে) চালায়।

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

ফলস্বরূপ যে আমরা সমস্যাটিকে তুলনামূলকভাবে সহজেই সাধারণ করতে পারি । '_' এবং "আপার-কেস" সরাসরি রূপান্তরটিতে হার্ড-কোডিংয়ের পরিবর্তে আমাদের মতো কিছু থাকতে পারে:

s&r(pattern, transform, string) {
    if (!pattern(string))
        return string
    else
        return transform(matched part of string) + s&r(rest of string);
}

তবে, আমরা আরই হিসাবে প্যাটার্নটি নির্দিষ্ট করে এমন কিছুের বিপরীতে আমরা প্যাটার্নটিকে একটি আসল ফাংশন হিসাবে সরাসরি নির্দিষ্ট করতে পারি এবং এখনও এটি ব্যবহার করতে পারি, যেমন:

my_pattern(string) return beginning(string) == '_';

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


4

এখানে র‍্যাকেটে সম্পূর্ণ কোড রয়েছে :

;; camelize : string -> string
(define (camelize str)
  (let ([parts (regexp-split #rx"_" str)])
    ;; result of regexp-split is never empty
    (apply string-append
           (first parts)
           (map string-titlecase (rest parts)))))

(camelize "qwe_asd_zxc_rty_fgh_vbn")
;; => "qweAsdZxcRtyFghVbn"

কার্যনির্বাহী অভিজ্ঞতার সাথে একজন ক্রিয়ামূলক প্রোগ্রামার হিসাবে, আমি মনে করি না যে প্রক্রিয়াগত সমাধানটি "বের করতে" আমার বেশি সময় লাগবে, তবে এটি টাইপ করতে অবশ্যই আমার বেশি সময় লাগবে।

বিটিডব্লিউ, উদাহরণটি মূল পোস্টে প্রত্যাশিত ফলাফলটি ভুল: এটি শেষের কাছে একটি "এইচ" মিস করছে missing


জিডি যে নির্দেশ করে জন্য। সম্পাদিত
পেসারিয়ার

3

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

এখন, প্রক্রিয়াজাতীয় মডেলটি সাধারণ মেশিন আর্কিটেকচারের কিছুটা কাছাকাছি: অ্যাসাইনমেন্টগুলি মেমরি (বা নিবন্ধভুক্ত) লিখে থাকে। প্রক্রিয়া কলগুলি কেবলমাত্র অভিনব জাম্প, একটি ifআসলে শর্তযুক্ত জাম্প ইত্যাদি But এটি বোঝার জন্য আপনাকে ভাষা স্তর এবং শারীরিক মেশিনের মধ্যে একটি সম্পূর্ণ পৃথক বিমূর্ত ফাংশনাল মেশিনের কল্পনা করা দরকার, কারণ এবং সম্ভবত দৃশ্যমান বেশিরভাগ লোক এ পর্যন্ত পাবে না।

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


7
সেই যুক্তি অনুসারে এসেম্বলারের সকল ভাষা শেখার সহজ হওয়া উচিত :)
হোমডে

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

2
@ এমকো না, এই যুক্তি দ্বারা সত্যিকারের বাইটকোডগুলি 011011001001101...শেখার সহজতম ভাষা হবে!
মার্কজে

2
@ কনরাড: আরআইএসসি এসেম্বলার সম্ভবত শেখার সবচেয়ে সহজ ভাষা। কীভাবে এটি দরকারী
উপায়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.