হাস্কেল নিয়ে কি হট্টগোল? [বন্ধ]


109

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

কেউ কি কিছু হাস্কেলের উদাহরণ দিতে পারে যা দেখায় যে এটি এত মার্জিত / উচ্চতর কেন?

উত্তর:


134

আমার কাছে যেভাবে এটি তৈরি হয়েছিল এবং এখন একমাস হাস্কেলের উপর শেখার পরে আমি যা সত্য বলে মনে করি তা হ'ল কার্যকরী প্রোগ্রামিং আপনার মস্তিষ্ককে আকর্ষণীয় উপায়ে মুচড়ে দেয়: এটি আপনাকে বিভিন্নভাবে পরিচিত সমস্যাগুলি নিয়ে ভাবতে বাধ্য করে : লুপগুলির পরিবর্তে, মানচিত্র এবং ভাঁজ এবং ফিল্টার ইত্যাদিতে চিন্তা করুন general

হাস্কেল সম্পর্কে অন্যান্য সত্যই ঝরঝরে জিনিস এর টাইপ সিস্টেম। এটি কঠোরভাবে টাইপ করা হয়েছে, তবে টাইপ ইনফারেন্স ইঞ্জিনটি এটিকে পাইথন প্রোগ্রামের মতো মনে করে যা আপনাকে মূ .় টাইপ-সম্পর্কিত ভুল করার সময় ম্যাজিকালি বলে দেয়। এক্ষেত্রে হাস্কেলের ত্রুটির বার্তাগুলির কিছুটা অভাব রয়েছে, তবে আপনি যে ভাষাটি নিজের সাথে নিজের সম্পর্কে আরও বেশি পরিচিত হবেন আপনি নিজের কাছে বলবেন: টাইপিংয়ের কথা এটিই বলে!


47
এটি লক্ষ করা উচিত যে হাস্কেলের ত্রুটি বার্তাগুলির অভাব নেই, জিএইচসি রয়েছে। হাসেল মানকটি ত্রুটি বার্তাগুলি কীভাবে হয় তা নির্দিষ্ট করে না।
পাইরুলেজ

আমার মত অভিমতগুলির জন্য, জিএইচসি গ্লাসগো হাস্কেল সংকলককে বোঝায়। en.wikedia.org/wiki/Glasgow_Haskell_Compiler
Lorem Ipsum

137

এটি হ্যাস্কেল (এবং ছেলে আমি আনন্দিত যে আমি তা শিখতে শিখতে শিখিয়েছি ) এমন উদাহরণ এটি।

-- program to copy a file --
import System.Environment

main = do
         --read command-line arguments
         [file1, file2] <- getArgs

         --copy file contents
         str <- readFile file1
         writeFile file2 str

ঠিক আছে, এটি একটি সংক্ষিপ্ত, পঠনযোগ্য প্রোগ্রাম। সেই অর্থে এটি একটি সি প্রোগ্রামের চেয়ে ভাল। তবে কীভাবে এটি একেবারে একই কাঠামোযুক্ত পাইথন প্রোগ্রাম থেকে (বলুন) এতই আলাদা?

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

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

যেমনটি রয়েছে, হাস্কেল বুঝতে পেরেছে যে writeFileনির্ভর করে যে উপর নির্ভর করে readFileএবং তাই এই ডেটা পাথটিকে অনুকূলিত করতে সক্ষম।

ফলাফলগুলি সংকলক নির্ভর করে যখন আপনি উপরের প্রোগ্রামটি চালাবেন তখন সাধারণত যা ঘটবে তা হ'ল: প্রোগ্রামটি প্রথম ফাইলটির একটি ব্লক (8KB বলুন) পড়বে, পরে এটি দ্বিতীয় ফাইলে লিখবে, এবং প্রথম থেকে অন্য একটি ব্লক পড়বে ফাইল, এবং দ্বিতীয় ফাইল এটি লিখুন, এবং। ( straceএটি চালানোর চেষ্টা করুন!)

... যা একটি ফাইল অনুলিপি এর কার্যকর সি বাস্তবায়ন কি করবে অনেকটা দেখতে দেখতে।

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

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

  1. আরও ভাল প্রোগ্রাম ডিজাইন। হ্রাস জটিলতা কম যুক্তি ত্রুটি বাড়ে।

  2. কমপ্যাক্ট কোড। বাগের অস্তিত্বের জন্য কম লাইন।

  3. ত্রুটিগুলি সঙ্কলন করুন। প্রচুর বাগগুলি কেবল হাস্কেলকে বৈধ নয়

হাস্কেল সবার জন্য নয়। তবে প্রত্যেকের চেষ্টা করা উচিত।


আপনি 8KB ধ্রুবকটি ঠিক কীভাবে পরিবর্তন করবেন (বা তা যাই হোক না কেন)? কারণ আমি
বাজায়

1
@ মেহরদাদ আপনি এর সাথে বাফার আকার পরিবর্তন করতে পারেন hSetBuffering handle (BlockBuffering (Just bufferSize))
ডেভিড

3
এটি আশ্চর্যজনক যে এই উত্তরে 116 টি upvotes রয়েছে তবে যা আছে সেখানে কেবল ভুল। এই প্রোগ্রামটি হবে সমগ্র ফাইলটি পড়ার, যদি না আপনি অলস Bytestrings (আপনার সাথে কি করতে পারেন যা ব্যবহার Data.Bytestring.Lazy.readFile), যা Haskell, একটি অলস (অ-কঠোর) ভাষা হচ্ছে সঙ্গে কিছুই করার আছে। মনাদগুলি সিকোয়েন্সিং করছে - এর অর্থ মোটামুটি "আপনি ফলাফলটি বের করার সময় সমস্ত পার্শ্ব প্রতিক্রিয়াগুলি হয়ে যায়"। "অলস বাইট্রেস্টিং" যাদু সম্পর্কিত: এটি বিপজ্জনক, এবং আপনি অন্যান্য বেশিরভাগ ভাষায় অনুরূপ বা সরল বাক্য গঠন দিয়ে এটি করতে পারেন।
জো তাই

14
বিরক্তিকর পুরানো readFileমানটিও অলস আইও একইভাবে Data.ByteString.Lazy.readFileকরে does সুতরাং উত্তরটি ভুল নয় এবং এটি নিছক সংকলক অপ্টিমাইজেশন নয়। প্রকৃতপক্ষে, এটি হাস্কেলের পক্ষে একটি অনুমানের অংশ : " readFileফাংশনটি একটি ফাইল পড়ে এবং ফাইলের বিষয়বস্তুকে স্ট্রিং হিসাবে ফিরিয়ে দেয় with ফাইলটি চাহিদা মতো, অলসভাবে পড়া হয় getContents।"
ড্যানিয়েল ওয়াগনার

1
আমি মনে করি অন্যান্য উত্তরগুলি হ্যাস্কেল সম্পর্কে আরও বিশেষ বিষয়গুলিকে নির্দেশ করে। অনেক ভাষায় / পরিবেশের, স্ট্রীম নেই আপনি নোড অনুরূপ কিছু করতে পারেন: const fs = require('fs'); const [file1, file2] = process.argv.slice(2); fs.createReadStream(file1).pipe(fs.createWriteStream(file2))। : ব্যাশ খুব, অনুরূপ কিছু আছেcat $1 > $2
ম্যাক্স Heiber

64

আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন।

Haskell, যেখানে আপনি একটি কয়েক শীতল উদাহরণ এ বর্ণন যান এবং যেতে একটি ভাষা নয় "আহা, এখন তো দেখছি, যে কি এটা ভাল করে তোলে!"

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

  • অলস মূল্যায়ন
  • কোনও পার্শ্ব প্রতিক্রিয়া নেই (সবকিছু খাঁটি, আইও / ইত্যাদি মনডের মাধ্যমে ঘটে)
  • অবিশ্বাস্যভাবে এক্সপ্রেরিভ স্ট্যাটিক টাইপ সিস্টেম

পাশাপাশি কয়েকটি মূল বিষয় যা মূলধারার বিভিন্ন ভাষা থেকে আলাদা (তবে কিছু দ্বারা ভাগ করা হয়):

  • ক্রিয়ামূলক
  • উল্লেখযোগ্য সাদা স্থান
  • অনুমান করা টাইপ করুন

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


17
আমি আপনার প্রথম বাক্যটির সাথে একমত নই। আমি প্রথমে হাস্কেল কোডের কয়েকটি উদাহরণে সত্যিই মুগ্ধ হয়েছি এবং যা আমাকে সত্যই নিশ্চিত করেছিল যে এটি শেখার উপযুক্ত তা এই নিবন্ধটি ছিল: cs.dartmouth.edu/~doug/powser.html তবে অবশ্যই এটি গণিতবিদ / পদার্থবিজ্ঞানের পক্ষে আকর্ষণীয়। বাস্তব প্রোগ্রাম হিসাবে অনুসন্ধান করা একজন প্রোগ্রামার এই উদাহরণটিকে হাস্যকর মনে করবে।
রাফায়েল এস কলসাবেরিনী

2
@ রাফায়েল: এই প্রশ্নটি উত্থাপন করে "কোন প্রোগ্রামার বাস্তব জগতের জিনিসগুলি দেখে কী দ্বারা প্রভাবিত হবে"?
জেডি

ভাল প্রশ্ন! আমি কোনও "রিয়েল ওয়ার্ল্ড" প্রোগ্রামার নই তাই তারা কী পছন্দ করে তা আমি জানি না। হা হা হা ... আমি জানি পদার্থবিদ এবং গণিতবিদরা কী পছন্দ করেন। : পি
রাফায়েল এস কলসাবেরিনী 21

27

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

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


1
ঠিক আছে, সর্বদা এবং কেবল এসটি মোনাড এবং / বা unsafePerformIOকেবল যারা বিশ্বকে জ্বলতে দেখতে চায় তাদের জন্য ব্যবহার করার সম্ভাবনা রয়েছে ;)
সারা

22

গোলযোগের অংশটি হ'ল বিশুদ্ধতা এবং স্থির টাইপিং আক্রমণাত্মক অপটিমাইজেশনের সাথে সমান্তরালতার জন্য সক্ষম করে। সমান্তরাল ভাষাগুলি এখন গরম এবং মাল্টিকোরটি কিছুটা ব্যাঘাতকৃত।

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

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


"একটি দ্রুত, নেটিভ কোড সংকলক সহ"?
জেডি

আমি বিশ্বাস করি ডনগুলি জিএইচসিআই-কে উল্লেখ করছে।
গ্রেগরি হিগলি

3
@ জোন: শুটআউট.অালিথ.ডিবিয়ান.আর / ইউ 32/… উদাহরণস্বরূপ, হ্যাসেল শ্যুটআউটে বেশ ভাল কাজ করেছেন।
পিকার

4
@ জোন: শ্যুটআউট কোডটি অনেক পুরানো এবং এমন এক অতীত কাল থেকে যেখানে জিএইচসি অপ্টিমাইজ করা সংকলক কম ছিল। তা সত্ত্বেও, এটা Haskell, কোড প্রমাণ করতে কর্মক্ষমতা উত্পাদ প্রয়োজনে নিম্নস্তরের যান। শ্যুটআউটে আরও নতুন সমাধান আরও মূর্খবাদী এবং এখনও দ্রুত।
পিকার

1
@ গ্রেগরি হিগলে জিএইচসিআই এবং জিএইচসির মধ্যে পার্থক্য রয়েছে।
জেরেমি তালিকা

18

সফটওয়্যার ট্রানজেকশনাল মেমোরি একত্রে সামঞ্জস্য করার জন্য দুর্দান্ত উপায়। এটি বার্তা প্রেরণের চেয়ে অনেক বেশি নমনীয়, এবং মিটেক্সের মতো প্রবণতা নয়। জিএইচসি এর এসটিএম বাস্তবায়ন সেরা বিবেচনা করা হয়।


18

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

আমার পক্ষে সম্ভবত সবচেয়ে বড় জয়টি মনোয়েডস, ম্যানডাস ইত্যাদির মাধ্যমে নিয়ন্ত্রণ প্রবাহকে মডুলার করার ক্ষমতা ছিল। খুব সাধারণ উদাহরণ হ'ল অর্ডারিং মনোয়েড; যেমন একটি অভিব্যক্তি

c1 `mappend` c2 `mappend` c3

যেখানে c1এবং কীভাবে প্রত্যাবর্তন LT, EQবা GT, c1প্রত্যাবর্তনের EQকারণে অভিব্যক্তি অব্যাহত থাকে, মূল্যায়ন হয় c2; যদি c2রিটার্ন হয় LTবা GTএটি পুরোটির মান, এবং c3মূল্যায়ন না হয়। এই ধরণের জিনিসটি মোনাডিক মেসেজ জেনারেটর এবং পার্সারগুলির মতো জিনিসগুলিতে যথেষ্ট পরিশীলিত ও জটিল হয়ে ওঠে যেখানে আমি বিভিন্ন ধরণের রাজ্যের আশেপাশে বহন করতে পারি, বিবিধ গর্ভপাতের শর্ত থাকতে পারে, বা কোনও বিশেষ কল করার সিদ্ধান্ত নিতে সক্ষম হতে পারে যে বন্ধের প্রকৃত অর্থ কি না? "আর কোনও প্রক্রিয়াজাতকরণ নেই" বা এর অর্থ, "শেষে একটি ত্রুটি ফিরিয়ে দিন, তবে আরও ত্রুটি বার্তাগুলি সংগ্রহ করতে প্রসেসিং চালিয়ে যান" "

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

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


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

12

একটি আকর্ষণীয় উদাহরণের জন্য আপনি এটিকে দেখতে পারেন: http://en.literateprogram.org/Quicksort_( হাসেল)

মজার বিষয় হ'ল বিভিন্ন ভাষায় প্রয়োগটি দেখুন।

অন্যান্য কার্যকরী ভাষার পাশাপাশি হাস্কেলকে কী আকর্ষণীয় করে তোলে তা হ'ল প্রোগ্রামটি কীভাবে করা যায় সে সম্পর্কে আপনাকে আলাদাভাবে চিন্তা করতে হবে। উদাহরণস্বরূপ, আপনি সাধারণত লুপগুলির জন্য বা যখন ব্যবহার করবেন না তবে পুনরাবৃত্তি ব্যবহার করবেন।

উপরে উল্লিখিত হিসাবে, হাস্কেল এবং অন্যান্য কার্যকরী ভাষা সমান্তরাল প্রক্রিয়াকরণ এবং মাল্টি-কোরগুলিতে কাজ করার জন্য লেখার অ্যাপ্লিকেশন সহ এক্সেল করে।


2
পুনরাবৃত্তি বোমা হয়। যে এবং প্যাটার্ন মিল।
এলিরি নিউকামার

1
কার্যকরী ভাষায় লেখার সময় লুপের জন্য এবং ছাড়িয়ে যাওয়া আমার পক্ষে সবচেয়ে কঠিন অংশ। :)
জেমস ব্ল্যাক

4
লুপগুলির পরিবর্তে পুনরাবৃত্তিতে ভাবা শেখা আমার পক্ষে খুব কঠিন অংশ ছিল। যখন এটি অবশেষে ডুবে গেল, এটি আমার মধ্যে সর্বকালের অন্যতম বৃহত প্রোগ্রামিং এপিফিনি ছিল।
ক্রিস কননেট

8
কর্মক্ষম হাস্কেল প্রোগ্রামার ব্যতীত আদিম পুনরাবৃত্তি ব্যবহার করে; সাধারণত আপনি মানচিত্র এবং ফোল্ডারের মতো লাইব্রেরি ফাংশন ব্যবহার করেন।
পল জনসন

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

8

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


1
সংকলকের উত্স কোড পড়তে ভুলবেন না। এটি আপনাকে অনেক মূল্যবান তথ্যও দেবে।
জেডি

7

অ্যালগরিদম বা গাণিতিক সমস্যার সাথে মোকাবিলা করার সময় আমি একটি জিনিস খুব শীতল দেখতে পাই হ্যাস্কেলের গণনাগুলির অন্তর্নিহিত অলস মূল্যায়ন, যা কেবল তার কঠোর কার্যকরী প্রকৃতির কারণে সম্ভব।

উদাহরণস্বরূপ, আপনি যদি সমস্ত প্রাইমগুলি গণনা করতে চান তবে আপনি ব্যবহার করতে পারেন

primes = sieve [2..]
    where sieve (p:xs) = p : sieve [x | x<-xs, x `mod` p /= 0]

এবং ফলাফলটি আসলে একটি অসীম তালিকা। তবে হাস্কেল এটিকে ডান থেকে বামে মূল্যায়ন করবে, যতক্ষণ না আপনি পুরো তালিকার প্রয়োজন এমন কিছু করার চেষ্টা না করেন ততক্ষণ আপনি প্রোগ্রামটিকে অনন্ততায় আটকে না রেখে ব্যবহার করতে পারবেন যেমন:

foo = sum $ takeWhile (<100) primes

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

এটি কেবল অসীম তালিকার জন্যই কার্যকর নয়, যখন প্রয়োজনের চেয়ে বেশি মূল্যায়ন করার প্রয়োজন নেই তখন এটি আপনাকে সর্বদা না জেনে ব্যবহার করা হয়।


2
এটি সম্পূর্ণ সত্য নয়; সি # (একটি অবজেক্ট-ভিত্তিক ভাষা) এর ফলন ফেরতের আচরণের সাহায্যে, আপনি অনন্ত তালিকাও ঘোষণা করতে পারেন যা চাহিদা অনুসারে মূল্যায়ন করা হয়।
জেফ ইয়েটস

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

8
আপনি পড়তে আগ্রহী হতে পারেন কেন "চালুনি" এরাতোস্টিনিসের চালনা নয় : ল্যাম্বডা -এইটিমুটিমেট.অর্গ
ক্রিস কনওয়ে

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

6

আমি অন্যদের সাথে একমত যে কয়েকটি ছোট উদাহরণ দেখে হাসেলকে দেখানোর সেরা উপায় নয় not তবে আমি কিছু না কিছু দেব। এখানে অ্যালার প্রকল্পের সমস্যাগুলির একটি বজ্র-দ্রুত সমাধান এখানে 18 এবং 67 , যা আপনাকে বেস থেকে ত্রিভুজের শীর্ষে সর্বাধিক যোগফল খুঁজে পেতে বলে:

bottomUp :: (Ord a, Num a) => [[a]] -> a
bottomUp = head . bu
  where bu [bottom]     = bottom
        bu (row : base) = merge row $ bu base
        merge [] [_] = []
        merge (x:xs) (y1:y2:ys) = x + max y1 y2 : merge xs (y2:ys)

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

data BubbleResult i o = BubbleResult { bestResult :: o
                                     , result :: o
                                     , leftoverRandoms :: [Double]
                                     }
bubbleSearch :: (Ord result) =>
                ([a] -> result) ->       -- greedy search algorithm
                Double ->                -- probability
                [a] ->                   -- list of items to be searched
                [Double] ->              -- list of random numbers
                [BubbleResult a result]  -- monotone list of results
bubbleSearch search p startOrder rs = bubble startOrder rs
    where bubble order rs = BubbleResult answer answer rs : walk tries
            where answer = search order
                  tries  = perturbations p order rs
                  walk ((order, rs) : rest) =
                      if result > answer then bubble order rs
                      else BubbleResult answer result rs : walk rest
                    where result = search order

perturbations :: Double -> [a] -> [Double] -> [([a], [Double])]
perturbations p xs rs = xr' : perturbations p xs (snd xr')
    where xr' = perturb xs rs
          perturb :: [a] -> [Double] -> ([a], [Double])
          perturb xs rs = shift_all p [] xs rs

shift_all p new' [] rs = (reverse new', rs)
shift_all p new' old rs = shift_one new' old rs (shift_all p)
  where shift_one :: [a] -> [a] -> [Double] -> ([a]->[a]->[Double]->b) -> b
        shift_one new' xs rs k = shift new' [] xs rs
          where shift new' prev' [x] rs = k (x:new') (reverse prev') rs
                shift new' prev' (x:xs) (r:rs) 
                    | r <= p    = k (x:new') (prev' `revApp` xs) rs
                    | otherwise = shift new' (x:prev') xs rs
                revApp xs ys = foldl (flip (:)) ys xs

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

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


5

আমার কাছে হাস্কেলের আকর্ষণ হ'ল সংকলনের গ্যারান্টিযুক্ত নির্ভুলতার প্রতিশ্রুতি । এমনকি এটি কোডের খাঁটি অংশগুলির জন্য হলেও।

আমি বৈজ্ঞানিক সিমুলেশন কোড অনেক লিখেছি, এবং বিস্ময়ের উদ্রেক তাই যদি আমার পূর্বে কোড মধ্যে একটি বাগ, যা বর্তমান কাজ অনেক বাতিল ছিল অনেক বার।


6
এটি কীভাবে সঠিকতার গ্যারান্টি দেয়?
জোনাথন ফিশফফ

কোডের খাঁটি অংশগুলি অপরিষ্কার অংশগুলির চেয়ে অনেক বেশি নিরাপদ। আস্থা-বিশ্বাসের / স্তরের বিনিয়োগের স্তরটি উচ্চতর।
আরপিজি

1
কী এমন ছাপ দিয়েছে?
জেডি

5

আমি দেখতে পেয়েছি যে নির্দিষ্ট কিছু কাজের জন্য আমি হাস্কেলের সাথে অবিশ্বাস্যভাবে উত্পাদনশীল।

কারণটি সাসিনেক্ট সিনট্যাক্স এবং পরীক্ষার স্বাচ্ছন্দ্যের কারণে।

ফাংশন ডিক্লেয়ারেশন সিনট্যাক্স এর মতো:

foo a = a + 5

এটি একটি সহজ উপায় আমি কোনও ফাংশন সংজ্ঞায়িত করার কথা ভাবতে পারি।

আমি যদি উল্টোটা লিখি

inversFoo a = a - 5

আমি যাচাই করতে পারি যে এটি লিখে কোনও র্যান্ডম ইনপুটের জন্য একটি বিপরীত

প্রোপ_আইসইনভার্স :: ডাবল -> বুল
প্রোপ_আইএসআইভারস a = a == (ইনভার্সফু $ ফু এ)

এবং কমান্ড লাইন থেকে কল

জনি @ উবুন্টু: রানহাস্কেল কুইলচেক + নামগুলি fooFileName.hs

যা আমার ফাইলের সমস্ত বৈশিষ্ট্যগুলি এলোমেলোভাবে ইনপুটগুলিকে একশবার পরীক্ষা করে পরীক্ষা করে দেখবে।

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


আপনি কোন সমস্যাগুলি সমাধান করছেন এবং কোন অন্যান্য ভাষা আপনি চেষ্টা করেছেন?
জেডি

1
মোবাইল এবং আইপ্যাডের জন্য রিয়েল টাইম 3 ডি গ্রাফিক্স।
জোনাথন ফিশফফ

3

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


1
কি পেতে আছে? যদি আপনার অবশ্যই হয় তবে "ডেটা" == "শ্রেণি" এবং "টাইপক্লাস" = "ইন্টারফেস" / "ভূমিকা" / "বৈশিষ্ট্য" মনে করুন। এটি সহজ হতে পারে না। (আপনাকে
বিভ্রান্ত

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

2

এটির কোনও লুপ নির্মাণ নেই। অনেক ভাষারই এই বৈশিষ্ট্য নেই।


17
ghci>: এম + কন্ট্রোল.মোনাদ জিটিসি> ফরএম_ [১.৩.৩] প্রিন্ট 1 2 3
সস্তানিন

1

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


-1

বিপরীত দৃষ্টিভঙ্গি দেখানোর জন্য: স্টিভ ইয়েজ লিখেছেন যে হিন্দি-মিলনার ভাষাগুলিতে ভাল সিস্টেম লেখার জন্য প্রয়োজনীয় নমনীয়তার অভাব রয়েছে :

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

হাস্কেল শেখার পক্ষে মূল্যবান তবে এর নিজস্ব দুর্বলতা রয়েছে।


5
যদিও এটি অবশ্যই সত্য যে শক্তিশালী টাইপ সিস্টেমগুলিতে সাধারণত আপনাকে তাদের মেনে চলতে হবে (এটিই তাদের শক্তিকে কার্যকর করে তোলে), এটি এমনও যে অনেকগুলি (সবচেয়ে?) বিদ্যমান এইচএম ভিত্তিক টাইপ সিস্টেমগুলি বাস্তবে কিছু প্রকারের ' লিঙ্কে বর্ণিত হিসাবে হ্যাচ পলাতক (উদাহরণস্বরূপ ও'ক্যামলে Obj.magic নিন, যদিও আমি এটি হ্যাক ছাড়া কখনও ব্যবহার করি নি); বাস্তবে, তবে, বিভিন্ন ধরণের প্রোগ্রামের জন্য কখনই এ জাতীয় ডিভাইসের প্রয়োজন হয় না।
জাচ স্নো

3
ভেরিয়েবলগুলি "কাঙ্ক্ষিত" নির্ধারণ করা হবে কিনা তা নির্ভর করে ভেরিয়েবলের ব্যবহারের ফলে কতটা ব্যথা হয় তা বিকল্প বনামগুলি ব্যবহার করতে কত ব্যথা হয় তা নির্ভর করে। এটি পুরো আর্গুমেন্টকে খারিজ করার জন্য নয়, বরং এটি উল্লেখ করা উচিত যে অক্ষর হিসাবে একটি অক্ষ হিসাবে "ভেরিয়েবলগুলি একটি অত্যন্ত আকাঙ্ক্ষিত গঠন" হিসাবে বক্তব্য গ্রহণ করা কোনও যৌক্তিক যুক্তির ভিত্তি নয়। এটি বেশিরভাগ লোকেরা কীভাবে প্রোগ্রাম করবেন তা শিখতে হয়।
gtd

5
-১: স্টিভের বক্তব্যগুলি আংশিক পুরানো তবে বেশিরভাগ ক্ষেত্রে সম্পূর্ণভাবে সত্য ভুল। ওক্যামেলের শিথিল মান সীমাবদ্ধতা এবং। নেট এর ধরণের সিস্টেমটি তার বক্তব্যের কয়েকটি সুস্পষ্ট পাল্টা উদাহরণ।
জেডি

4
স্ট্যাটিক ইয়েগের স্ট্যাটিক টাইপিংয়ের বিষয়ে তার বোনটে একটি অযৌক্তিক মৌমাছি রয়েছে এবং এটি সম্পর্কে তিনি যে-কথাটি ভুল বলেন তা কেবল তাই নয়, তিনি প্রতিটি উপলভ্য সুযোগে (এবং কিছু অনুপলভ্য এমনকি) এটিকে বজায় রাখেন। এক্ষেত্রে শুধুমাত্র আপনার নিজের অভিজ্ঞতার উপর বিশ্বাস রাখা ভাল।
শ্রীভাতসারআর

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