কেন হাস্কেলের "কিছুই না করে" ফাংশন, আইডি, টন মেমরি ব্যবহার করে?


112

হাস্কেলের একটি পরিচয় ফাংশন রয়েছে যা ইনপুটটি অপরিবর্তিত রাখে। সংজ্ঞাটি সহজ:

id :: a -> a
id x = x

মজাদার জন্য, এই আউটপুট করা উচিত 8:

f = id id id id id id id id id id id id id id id id id id id id id id id id id id id
main = print $ f 8

কয়েক সেকেন্ড পরে (এবং টাস্ক ম্যানেজার অনুযায়ী মেমরি প্রায় 2 গিগাবাইট) পরে, সংকলন ব্যর্থ হয় ghc: out of memory। একইভাবে, দোভাষী ড ghci: out of memory

যেহেতু idএকটি দুর্দান্ত সরল ফাংশন, তাই আমি চালানোর সময় বা সংকলনের সময় এটি মেমরির বোঝা হওয়ার আশা করবো না। সমস্ত স্মৃতি কি জন্য ব্যবহার করা হচ্ছে?


11
আপনি ids গুলি রচনা করতে চান । VIM সালে সংজ্ঞা কার্সার সঙ্গে f, এই একটি করুন: :s/id id/id . id ./g
টোবিয়াস ব্র্যান্ড্ট

উত্তর:


135

আমরা এর প্রকারটি জানি id,

id :: a -> a

এবং যখন আমরা এটির জন্য বিশেষীকরণ করি তখন id idএর বাম অনুলিপিটি idটাইপ করে:

id :: (a -> a) -> (a -> a)

এবং তারপরে আপনি যখন আবার এই বামদিকের জন্য বিশেষায়িত idহন id id id, আপনি পাবেন:

id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))

সুতরাং আপনি যুক্ত প্রতিটি দেখতে পাবেন id, বাম পাশে idঅবস্থিত স্বাক্ষরটির দ্বিগুণ পরিমাণ।

নোট করুন যে সংকলনের সময় প্রকারগুলি মুছে ফেলা হয়, সুতরাং এটি কেবল GHC এ মেমরি গ্রহণ করবে take এটি আপনার প্রোগ্রামে স্মৃতি গ্রহণ করবে না।


আমার মনে আছে ওসাকাসি যখন হ্যাসকেলে এম্বেড করা একটি আরপিএন ক্যালকুলেটর লিখেছিলেন তখন এই জাতীয় কিছু সমস্যার মধ্যে পড়েছিল।
ডিফিউয়ার

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

5
@ dfeuer gci টাইপ জিজ্ঞাসা করার চেষ্টা করুন। প্রতিক্রিয়ার গতিবেগ আপনি দেখতে পাবেন যে এটি অবশ্যই যথাযথ ভাগ করে নেবে। আমি সন্দেহ করি যে এই শেয়ারিংটি হারিয়ে গেছে - সুস্পষ্ট কারণে - একবার আপনি কিছু অন্য মধ্যবর্তী প্রতিনিধিত্ব (উদাহরণস্বরূপ) অনুবাদ করেন।
ড্যানিয়েল ওয়াগনার 21

4
এর অর্থ হ'ল যদি idবারবার পুনরাবৃত্তি nকরা হয় তবে এর ধরণের স্থানটি আনুপাতিক 2^n। রায়ান কোডটিতে অনুমান করা টাইপটির ধরণের 2^27প্রতিনিধিত্ব করার জন্য প্রয়োজনীয় অন্যান্য কাঠামোর পাশাপাশি তার ধরণের ভেরিয়েবলের রেফারেন্সের প্রয়োজন হবে যা সম্ভবত আপনি বেশিরভাগ ধরণের প্রত্যাশার চেয়ে অনেক বড়।
ডেভিড

58
নির্লজ্জভাবে প্রকারের অনুমান করা ডাবল সূচকীয়, প্রজ্ঞাটি ভাগ করে চালাকতার সাথে ব্যবহার করে আপনি এটিকে কেবল ঘনিষ্ঠভাবে নামিয়ে আনতে পারেন। তবে আপনি যা করেন তা বিচার্য নয়, কিছু সহজ সরল অভিব্যক্তি হবে যা প্রকারের পরীক্ষককে বিস্ফোরিত করবে। ভাগ্যক্রমে, এগুলি ব্যবহারিক প্রোগ্রামিংয়ে ঘটে না।
22 'এ 22
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.