আমি সম্প্রতি গ্রেট গুড গাইডের জন্য আপনি শিখুন একটি হাস্কেল দিয়ে যাচ্ছিলেন এবং অনুশীলন হিসাবে আমি এটির সাথে প্রকল্প ইউলারের সমস্যা 5 সমাধান করতে চেয়েছিলাম , যা নির্দিষ্ট করে:
1 থেকে 20 পর্যন্ত সমস্ত সংখ্যার দ্বারা সমানভাবে বিভাজ্য সবচেয়ে ছোট ধনাত্মক সংখ্যাটি কী?
প্রদত্ত সংখ্যা এই সংখ্যার দ্বারা বিভাজ্য কিনা তা নির্ধারণ করে আমি প্রথমে একটি ফাংশন লেখার সিদ্ধান্ত নিয়েছি:
divisable x = all (\y -> x `mod` y == 0)[1..20]
তারপরে আমি ক্ষুদ্রতমটি ব্যবহার করে গণনা করেছি head
:
sm = head [x | x <- [1..], divisable x]
এবং অবশেষে ফলাফলটি প্রদর্শন করার জন্য লাইনটি লিখেছেন:
main = putStrLn $ show $ sm
দুর্ভাগ্যক্রমে এটি শেষ হতে প্রায় 30 সেকেন্ড সময় নিয়েছিল। 1 থেকে 10 সংখ্যার সাথে একই জিনিসটি করা প্রায় অবিলম্বে ফলাফল দেয় তবে তারপরে আবার ফলাফলটি 1 থেকে 20 এর সমাধানের চেয়ে অনেক ছোট।
আমি এটি সি এর আগে সমাধান করেছি এবং সেখানে 1 থেকে 20 এর ফলাফলও প্রায় তাত্ক্ষণিকভাবে গণনা করা হয়েছিল। এটি আমাকে বিশ্বাস করতে পরিচালিত করে যে আমি কীভাবে হাস্কেলের জন্য এই সমস্যার ব্যাখ্যা করব তা ভুল বুঝছি। আমি অন্য লোকের সমাধানগুলি সন্ধান করেছি এবং এটি পেয়েছি:
main = putStrLn $ show $ foldl1 lcm [1..20]
পর্যাপ্ত পরিমাণে, এটি একটি অন্তর্নির্মিত ফাংশন ব্যবহার করে, তবে নিজের ফলাফলটি করার পরে শেষ ফলাফলটি কেন এত ধীর হয়? সেখানকার টিউটোরিয়ালগুলি আপনাকে কীভাবে হাস্কেল ব্যবহার করবেন তা জানায় তবে অ্যালগোরিদমগুলিকে দ্রুত কোডে রূপান্তর করতে আমি তেমন সহায়তা দেখি না।