Jbapple এর চমৎকার উত্তর সম্পর্কে রিফিং replicate
, তবে পরিবর্তে replicateA
(যা replicate
অন্তর্নির্মিত) ব্যবহার করে আমি নিম্নলিখিতটি নিয়ে এসেছি:
--Unlike fromList, one needs the length explicitly.
myFromList :: Int -> [b] -> Seq b
myFromList l xs = flip evalState xs $ Seq.replicateA l go
where go = do
(y:ys) <- get
put ys
return y
myFromList
(ক সামান্য বেশি দক্ষ সংস্করণে) ইতিমধ্যে হয় সংজ্ঞায়িত করা হয় এবং অভ্যন্তরীণভাবে ব্যবহৃত মধ্যে Data.Sequence
আঙুল গাছ যে প্রকারের ফলাফল নেই নির্মাণের জন্য।
সাধারণভাবে, জন্য অন্তর্দৃষ্টি replicateA
সহজ। অ্যাপ্লিকটিট্রি ফাংশনের replicateA
শীর্ষে নির্মিত । একটি আকারের গাছের টুকরো নেয় এবং এর অনুলিপিযুক্ত একটি সুষম ভারসাম্যযুক্ত গাছ উত্পাদন করে । জন্য মামলা থেকে 8 আপ (একটি একক আঙুল) এক ধরনের হার্ড কোডেড হয়। এটির উপরে যে কোনও কিছু আছে এবং এটি নিজেকে পুনরাবৃত্তিতে ডাকে। "প্রয়োগকারী" উপাদানটি কেবলমাত্র এটি উপরের কোডের ক্ষেত্রে, রাষ্ট্রের মতো থ্রেডিং এফেক্টের সাহায্যে গাছের নির্মাণকে হস্তক্ষেপ করে।applicativeTree
m
n
n
Deep
go
ফাংশন, যা প্রতিলিপি করা হয়, কেবল একটি কর্ম যা, বর্তমান অবস্থায় পায় উপরে বন্ধ একটি উপাদান পপ, এবং বাকি প্রতিস্থাপন করা হয়। প্রতিটি অনুরোধে, এটি ইনপুট হিসাবে সরবরাহিত তালিকার আরও নীচে পদক্ষেপ নেয়।
আরও কিছু কংক্রিট নোট
main = print (length (show (Seq.fromList [1..10000000::Int])))
কিছু সাধারণ পরীক্ষায়, এটি একটি আকর্ষণীয় পারফরম্যান্স ট্রেড অফ করেছে। উপরের মূল ফাংশনটি MyFromList এর চেয়ে প্রায় 1/3 কম দৌড়েছিল fromList
। অন্যদিকে, myFromList
2MB এর ধ্রুবক স্তূপ ব্যবহৃত হয়, যখন মানটি fromList
926MB অবধি ব্যবহৃত হয়। 926MB একবারে পুরো তালিকা মেমরির মধ্যে রাখা প্রয়োজন থেকে উদ্ভূত। এদিকে, সমাধানটি myFromList
অলস স্ট্রিমিং ফ্যাশনে কাঠামোটি গ্রাস করতে সক্ষম। গতির ফলাফল এই বিষয়টি থেকে যেটি myFromList
প্রায় বরাদ্দ দ্বিগুণ করতে হবে (রাজ্য মনডের জুড়ি নির্মাণ / ধ্বংসের ফলস্বরূপ) হিসাবেfromList
। আমরা সিপিএস-রুপান্তরিত রাষ্ট্র মোনাডে গিয়ে এই বরাদ্দগুলি অপসারণ করতে পারি, তবে ফলস্বরূপ যে কোনও সময়ে আরও বেশি স্মৃতি ধরে রাখা যায়, কারণ অলসতার ক্ষতিতে তালিকাটি স্ট্রিমিং পদ্ধতিতে অনুসরণ করা প্রয়োজন vers
অন্যদিকে, যদি শোয়ের সাথে পুরো ক্রমটি চাপিয়ে দেওয়ার পরিবর্তে, আমি কেবল মাথা বা শেষ উপাদানটি বের করতে চলে যাই, myFromList
তাত্ক্ষণিকভাবে একটি বড় জয় উপস্থাপন করি - মাথা উপাদানটি বের করা প্রায় তাত্ক্ষণিক, এবং শেষ উপাদানটি বের করা 0.8s হয় । এদিকে, স্ট্যান্ডার্ড সহ fromList
, মাথা বা শেষ উপাদানটি উত্তোলনের জন্য খরচ হয় ~ 2.3 সেকেন্ড।
এটি সমস্ত বিবরণ, এবং এটি বিশুদ্ধতা এবং অলসতার পরিণতি। পরিব্যক্তি এবং এলোমেলো অ্যাক্সেসের মতো পরিস্থিতিতে আমি কল্পনা করব replicate
সমাধানটি আরও ভাল।
যাইহোক, এটি এমন প্রশ্নটি উত্থাপন করে applicativeTree
যে myFromList
এ জাতীয় পুনর্লিখনের কোনও উপায় রয়েছে যা আরও কঠোরভাবে দক্ষ। বিষয়টি হ'ল আমি মনে করি, গাছ প্রাকৃতিকভাবে বিচ্যুত হওয়ার চেয়ে প্রয়োগযোগ্য ক্রিয়াকলাপগুলি একটি ভিন্ন ক্রমে সম্পাদিত হয় তবে আমি কীভাবে এটি কাজ করে তা সম্পূর্ণরূপে কাজ করতে পারি নি, বা যদি সমাধান করার কোনও উপায় থাকে তবে।