হাস্কেল, লিস্প এবং শব্দভাণ্ডার [বন্ধ]


104

আপনারা যারা হাস্কেল এবং লিস্পের কিছু স্বাদে অভিজ্ঞতা লাভ করেছেন তাদের জন্য আমি কৌতূহল করছি যে হাস্কেল বনাম লিস্পে কোড লিখতে কীভাবে "আনন্দদায়ক" (একটি ভয়াবহ শব্দ ব্যবহার করতে) হয় is

কিছু ব্যাকগ্রাউন্ড: আমি এখন স্ক্যাস এবং সিএল (এবং ক্লোজারে কিছুটা সাহসী) নিয়ে কাজ করে এখন হাস্কেল শিখছি। Ditionতিহ্যগতভাবে, আপনি তাদের সংযুক্তি এবং দ্রুততার জন্য গতিশীল ভাষার ভক্ত হিসাবে বিবেচনা করতে পারেন। আমি দ্রুত লিসপ ম্যাক্রোর প্রেমে পড়ি, কারণ এটি আমাকে ভার্বোসিটি এবং বয়লারপ্লেট এড়ানোর আরও একটি উপায় দিয়েছে।

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

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

উত্তর:


69

সংক্ষিপ্ত উত্তর:

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

[দ্রষ্টব্য: একটি " টেম্পলেট হাস্কেল " রয়েছে যা আপনাকে লিস্পের মতো ম্যাক্রোগুলি লিখতে দেয়, তবে কঠোরভাবে বলতে গেলে আপনার কখনই এটির প্রয়োজন হবে না ]]


15
ডন স্টুয়ার্টের বরাত কনর ম্যাকব্রাইড থেকে: 'আমি আমাদের মহাকর্ষকে ঘৃণা করানোর মত প্রকারের কথা ভাবতে চাই, যাতে আমাদের [সঠিক প্রোগ্রাম লেখার] জন্য যে দিকনির্দেশনা প্রয়োজন তা "উতরাই" হয়ে যায়।' টাইপ সিস্টেমটি আশ্চর্যজনকভাবে সঠিক প্রোগ্রামগুলি লিখতে সহজ করে তোলে ... এই পোস্টটি এবং এর পুনরায় ভাগগুলি দেখুন।
শ্রীভৎসরআর

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

@MLjrg আপনার কি কোন দৃ concrete় উদাহরণ রয়েছে? নীচে Hibou57 এর উত্তরের মন্তব্যগুলি দেখুন যেখানে একটি কথিত উদাহরণ সন্দেহজনক বলে প্রমাণিত হয়েছে। আমি আপনার বলতে চাইছি বাছাই করতে আগ্রহী (উদাহরণস্বরূপ ম্যাক্রো সহ এবং ছাড়াই হাসেল কোড)।
শ্রীভাতসারআর

4
হাস্কেল থেকে তরকারি বের করুন। হাস্কেলের কী কী থাকবে তা দিয়ে আপনি কি এটি বাস্তবায়ন করতে পারেন? আরেকটি উদাহরণ: ধরুন যে হাস্কেল প্যাটার্ন মেলানো সমর্থন করে না, আপনি কি এইচএইচসি এর বিকাশকারীদের সমর্থন না করে নিজেই এটি যুক্ত করতে পারেন? সিএলে, আপনি ইচ্ছামত ভাষা প্রসারিত করতে ম্যাক্রো ব্যবহার করতে পারেন। আমি মনে করি সে কারণেই সিএল ভাষাটি 90 এর দশকের মান থেকে ফিরে আসে নি, যদিও হাস্কেলের মনে হয় জিএইচসি-তে কখনও এক্সটেনশনের অবসান ঘটেনি।
mljrg

64

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

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

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

আমি ব্যক্তিগতভাবে প্রোগ্রামিংয়ের লিস্প পদ্ধতিটিকে সাধারণভাবে পছন্দ করি, কারণ আমার মনে হয় এটি আমার আরও ভাল কাজ করার পদ্ধতিটি ফিট করে। তবে এর অর্থ এই নয় যে আপনিও তা করতে বাধ্য।


4
আপনি "হাস্কেলের প্রোগ্রামিং অনেক কম ইন্টারেক্টিভ" এর উপর আরও কিছুটা ব্যাখ্যা করতে পারেন। GHCi সত্যিই আপনার প্রয়োজনীয় সমস্ত সরবরাহ করে না?
জোহানেস জেরার

3
@ জোহানেস জিয়ারার: ​​আমি এটি চেষ্টা করে দেখিনি, তবে যতদূর আমি পড়ে দেখেছি, জিএইচসিআই চলমান চিত্রের শেল নয়, যেখানে আপনি পুরো প্রোগ্রামের চলমান সময় নির্বিচারে অংশগুলি পুনরায় সংজ্ঞায়িত করতে এবং প্রসারিত করতে পারেন। এছাড়াও, হাস্কেল সিনট্যাক্সটি প্রোগ্রামটি হিসাবে repl এবং সম্পাদকের মধ্যে প্রোগ্রামের টুকরোগুলি অনুলিপি করা আরও শক্ত করে তোলে।
সোভান্ট

13

প্রচলিত পাতার মর্মর তুলনায় মধ্যে Haskell metaprogramming কারণ অনেক monads প্রায় গঠিত হতে পারে এবং যোগ সিনট্যাক্স তোলে এমবেডেড DSLs কম গাছ মত চেহারা জন্য কম প্রয়োজন নেই, কিন্তু সবসময় টেমপ্লেট Haskell, এর, যেমন উল্লেখ ShreevatsaR , এবং এমনকি Liskell (Haskell, শব্দার্থবিদ্যা + + পাতার মর্মর সিনট্যাক্স) যদি আপনি প্রথম বন্ধনী পছন্দ করেন।


1
লিস্কেল লিঙ্কটি মারা গেছে তবে আজকাল হ্যাকেট আছে
নেস

10

ম্যাক্রোগুলি সম্পর্কিত, এখানে একটি পৃষ্ঠা যা এটি সম্পর্কে কথা বলছে: হ্যালো হাস্কেল, বিদায় লিসপ । এটি এমন একটি দৃষ্টিভঙ্গি ব্যাখ্যা করে যেখানে হাস্কেলটিতে ম্যাক্রোগুলির দরকার নেই not এটি তুলনার জন্য একটি সংক্ষিপ্ত উদাহরণ সহ আসে।

উদাহরণস্বরূপ যেখানে উভয় যুক্তির মূল্যায়ন এড়াতে একটি এলআইএসপি ম্যাক্রোর প্রয়োজন:

(defmacro doif (x y) `(if ,x ,y))

উদাহরণস্বরূপ যেখানে ম্যাক্রো সংজ্ঞা মত কোনও প্রয়োজন ছাড়াই হাস্কেল ব্যবস্থাপনামূলকভাবে উভয় যুক্তির মূল্যায়ন করে না:

doif x y = if x then (Just y) else Nothing

এবং voilà


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

8
@ এলি বারজিলে: আমি এই উদাহরণটি খুব দৃinc়প্রত্যয়ী পাই না। এখানে স্লাইড 40 এর সম্পূর্ণ, সাধারণ হাস্কেল অনুবাদ রয়েছে: পেস্টবিন.com
রিড বার্টন

5
@ এলি বারজিলে: আপনার প্রতিক্রিয়া আমি মোটেই বুঝতে পারি না। accept হয় (ই) ডিএসএল। acceptফাংশন ম্যাক্রো পূর্ববর্তী পাতায় রূপরেখা অ্যানালগ, এবং সংজ্ঞা vঠিক সংজ্ঞা সমান্তরাল হয় vদ্য Haskell, এবং প্রকল্প ফাংশন গনা স্লাইড 40 উপর স্কিম একই মূল্যায়ন কৌশলের সঙ্গে একই জিনিস। সর্বোপরি, ম্যাক্রো আপনাকে আপনার প্রোগ্রামের আরও কাঠামোটি অপটিমাইজারের কাছে প্রকাশ করতে দেয়। আপনি একে খুব উদাহরণস্বরূপ দাবি করতে পারেন যেখানে ম্যাক্রোস ভাষাটির অভিব্যক্তিগত শক্তিটিকে এমনভাবে বাড়িয়ে তোলে যা অলস মূল্যায়নের দ্বারা প্রতিরূপ হয় না।
রিড বার্টন

5
@ এলি বারজিলে: একটি অনুমানমূলক অলস স্কিমে আপনি এটি লিখতে পারেন: পেস্টবিন. com/ টিএন 3 এফ 8 ভিভি আমার সাধারণ দাবী এই ম্যাক্রো আপনাকে খুব কম কিনে: সামান্য ভিন্ন বাক্য গঠন এবং অপ্টিমাইজারের জন্য একটি সহজ সময় (তবে এতে কিছু আসে যায় না) একটি "যথেষ্ট স্মার্ট সংকলক")। বিনিময়ে, আপনি নিজেকে একটি অনভিজ্ঞ ভাষায় আটকে রেখেছেন; আপনি কোনও অটোমেটনকে কীভাবে সংজ্ঞায়িত করবেন যা সমস্ত তালিকা না রেখে কোনও অক্ষরের সাথে মেলে? এছাড়াও, "সমস্ত উপ-তালিকাগুলিতে এটি ব্যবহার করে" বা "যেখানে তার নিজস্ব সুযোগ রয়েছে সেখানে প্রয়োজনীয় ব্যবহার" বলতে আপনি কী বোঝাতে চেয়েছেন তা আমি জানি না।
রিড বার্টন

15
ঠিক আছে আমি যাচ্ছি. দৃশ্যত ডিএসএল আপনার সংজ্ঞা এবং তাই আমার অলস স্কিম উদাহরণ হচ্ছে ডিএসএল নয় "একটি ম্যাক্রো আর্গুমেন্ট", আসল চিহ্নগুলি সিন্টেক্সের isomorphic হচ্ছে (অক্ষুন্ন রেখেই automatonহয়ে letrec, :হয়ে উঠছে accept, ->এই সংস্করণে কিছুই হয়ে উঠছে)। যাই হোক.
রিড বার্টন

9

আমি একজন কমন লিস্প প্রোগ্রামার।

কিছুক্ষণ আগে হাস্কেলকে চেষ্টা করার পরে আমার ব্যক্তিগত নীচের লাইনটি ছিল সিএল সাথে থাকা।

কারণ:

হাস্কেলের অবশ্যই নিজস্ব নিজস্ব যোগ্যতা রয়েছে এবং এটি মৌলিকভাবে ভিন্ন উপায়ে কিছু কাজ করে তবে এটি আমার জন্য দীর্ঘমেয়াদে কাটবে না।


আরে আপনি কি সেই কোস্টানজা কাগজের শিরোনামটি যুক্ত করেছেন? দেখে মনে হচ্ছে যে ফাইলটি সরানো হয়েছিল।
মিচিয়াকিগ

2
নোট করুন যে হ্যাশেলও প্রিফিক্স সিনট্যাক্সকে সমর্থন করে তবে আমি বলব যে মোনাড >> = এটি ব্যবহার করা খুব কুশ্রী হবে। এছাড়াও আমি অপবিত্রতা আশীর্বাদ হওয়ার সাথে একমত নই: পি
বিকল্প

2
আমি এই পার্শ্ব-নোটটি পছন্দ করি: এই সমস্যাটি বাস্তব-বিশ্ব প্রোগ্রামগুলিতে গুরুতর সমস্যা সৃষ্টি করে কিনা তা আমরা এখনও অভিজ্ঞতামূলক তথ্য সংগ্রহ করি নি।
জেরোম বাউম

22
সেই কাগজের উদাহরণগুলির মধ্যে কোনওটিই (পাস্কাল কোস্টানজা, ডায়নামিক বনাম স্ট্যাটিক টাইপিং - একটি প্যাটার্ন-ভিত্তিক বিশ্লেষণ ) হাস্কেলের ক্ষেত্রে প্রযোজ্য নয়। এগুলি সমস্ত জাভা-নির্দিষ্ট (বা আরও সুনির্দিষ্টভাবে, "অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং" এর জন্য নির্দিষ্ট ) এবং আমি হাসকেলে এই বিষয়গুলির কোনওটিই দেখতে পাচ্ছি না। একইভাবে, আপনার অন্যান্য সমস্ত যুক্তি বিতর্কযোগ্য: এক পক্ষে এটিও বলা যায় যে হাস্কেল "খাঁটি এবং দ্রুত প্রোটোটাইপিংয়ের জন্য আরও উপযুক্ত", উপসর্গ বাক্য গঠনটি বাধ্যতামূলক নয়, এতে বিভিন্ন সংখ্যক সংকলক রয়েছে যা বিভিন্ন কাজ করে that , ইত্যাদি
শ্রীবতসারআর

11
সেই কাগজটি হাস্কেলের কাছে প্রায় সম্পূর্ণ অপ্রাসঙ্গিক। " dilbert = dogbert.hire(dilbert);" ?? আমি সন্দেহ করি অনেক হাস্কেল প্রোগ্রামার এমনকি কিছুটা পাকানো ছাড়াই এটি পড়তে পারে।
বাম দিকের বাইরে

6

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


5
স্কিম (দুটি প্রধান এলআইএসপি উপভাষার মধ্যে একটি) আসলে অলস মূল্যায়ন করে, যদিও এটি হাস্কেলের মতো ডিফল্ট নয়।
র‌্যান্ডি ভোয়েট

7
(ডিফম্যাক্রো ডাইফ (xy) `(যদি, এক্স, y))
জোশুয়া গাল

4
কোনও ম্যাক্রো কোনও ফাংশনের মতো নয় - ম্যাক্রোগুলি উচ্চ-অর্ডার ফাংশনগুলির মতো ভাল কাজ করে না fold, উদাহরণস্বরূপ যেখানে অ-কঠোর ফাংশনগুলি করে
তিখন জেলভিস

5

হাস্কেলের জটিল (যদি সম্ভব হয়) ম্যাক্রোগুলির সাথে আপনি লিস্পে অর্জন করতে পারেন এমন দুর্দান্ত জিনিস রয়েছে। উদাহরণস্বরূপ 'মেমোয়েজ' ম্যাক্রো ধরুন (পিটার নরভিগের পিএআইপি-র 9 নং অধ্যায় দেখুন)। এটির সাহায্যে আপনি একটি ফাংশন সংজ্ঞায়িত করতে পারেন, foo বলতে পারেন এবং তারপরে কেবল (মেমোয়েজ 'foo) মূল্যায়ন করতে পারেন, যা foo এর গ্লোবাল সংজ্ঞাটিকে একটি মেমোজাইজড সংস্করণ দিয়ে প্রতিস্থাপন করে। উচ্চতর অর্ডার ফাংশনগুলির সাথে আপনি কি হাস্কেলের একই প্রভাব অর্জন করতে পারেন?


3
একেবারে (এএফএইকি) নয়, তবে ফাংশনটি সংশোধন করে প্যারামিটার হিসাবে কল করতে ফাংশনটি পরিবর্তন করে (এটি পুনরাবৃত্তি বলে ধরে নেওয়া) ঠিক একইরকম কিছু করতে পারেন: ( haskell.org/haskellwiki/ স্মৃতি
j_random_hacker

6
আপনি অলস ডাটা-স্ট্রাকচারে ফু যোগ করতে পারেন, যেখানে মানটি একবার গণনা করা হবে। এটি কার্যকরভাবে একই হবে।
থিও ব্লেয়ার

হাস্কেলের সমস্ত কিছু মেমোমাইজড এবং সম্ভবত যখন হ্যাস্কেল সংকলক দ্বারা ডিফল্টরূপে প্রয়োজন হয় তখন অন্তর্ভুক্ত।
aoeu256

4

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

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