দ্রষ্টব্য যে ডাব্লুএইচএনএফ-তে কোনও অভিব্যক্তি হ্রাস :sprint
করে না । যদি এটি হয়, তবে নিম্নলিখিতগুলি 4
পরিবর্তে দেবে _
:
Prelude> let four = 2 + 2 :: Int
Prelude> :sprint four
four = _
পরিবর্তে, :sprint
একটি বাঁধাইয়ের নাম নেয়, বাঁধার মানটির অভ্যন্তরীণ উপস্থাপনাকে চিহ্নিত করে এবং ইতিমধ্যে "মূল্যায়নকৃত অংশগুলি" (যেমন _
অংশগুলি নির্মাতারা ) দেখায় যখন অবমূল্যায়িত থাবাগুলির জন্য স্থানধারক হিসাবে ব্যবহৃত হয় (অর্থাত্, স্থগিত অলস ফাংশন) কল)। মানটি সম্পূর্ণরূপে অবমূল্যায়িত হলে, কোনও মূল্যায়ন করা হবে না, এমনকি ডাব্লুএইচএনএফ-তেও নয়। (এবং যদি মানটি সম্পূর্ণরূপে মূল্যায়ন করা হয় তবে আপনি কেবল ডাব্লুএইচএনএফ নয়, এটি পেয়ে যাবেন))
আপনি আপনার পরীক্ষাগুলিতে যা পর্যবেক্ষণ করছেন তা বহুবর্ষীয় বনাম মনোমরফিক সংখ্যার ধরণের সংমিশ্রণ, স্ট্রিং লিটারালগুলির জন্য বিভিন্ন অভ্যন্তরীণ উপস্থাপনা বনাম বর্ণগুলির সুস্পষ্ট তালিকা ইত্যাদির মূলত, আপনি কীভাবে বিভিন্ন আক্ষরিক এক্সপ্রেশনগুলি বাইট কোডে সংকলিত হয় তার প্রযুক্তিগত পার্থক্য লক্ষ্য করছেন। সুতরাং, ডাব্লুএইচএনএফ-এর সাথে কিছু করার মতো এই প্রয়োগের বিশদটি ব্যাখ্যা করা আপনাকে আশাহীনভাবে বিভ্রান্ত করছে। সাধারণত, আপনার :sprint
কেবলমাত্র ডিবাগিং সরঞ্জাম হিসাবে ব্যবহার করা উচিত , ডাব্লুএইচএনএফ এবং হাস্কেল মূল্যায়নের শব্দার্থক সম্পর্কে জানার উপায় হিসাবে নয়।
আপনি যদি সত্যিই কী :sprint
করছে তা বুঝতে চান , আপনি কীভাবে এক্সপ্রেশনগুলি পরিচালনা করছেন এবং তা শেষ পর্যন্ত বাইটকোডে সংকলিত হয়েছে তা দেখতে আপনি জিএইচসিআই-তে কয়েকটি পতাকা চালু করতে পারেন:
> :set -ddump-simpl -dsuppress-all -dsuppress-uniques
এই পর, আমরা কারণ আপনার দেখতে পারেন intlist
দেয় _
:
> let intlist = [[1,2],[2,3]]
==================== Simplified expression ====================
returnIO
(: ((\ @ a $dNum ->
: (: (fromInteger $dNum 1) (: (fromInteger $dNum 2) []))
(: (: (fromInteger $dNum 2) (: (fromInteger $dNum 3) [])) []))
`cast` <Co:10>)
[])
আপনি returnIO
এবং বাইরের :
কলটিকে উপেক্ষা করতে পারেন এবং যে অংশটি শুরু হয় তাতে মনোনিবেশ করতে পারেন((\ @ a $dNum -> ...
সীমাবদ্ধতার $dNum
জন্য এখানে অভিধান Num
। এর অর্থ এই যে কোডটি এখনো প্রকৃত টাইপ সমাধান করেননি a
ধরনের Num a => [[a]]
, তাই সমগ্র অভিব্যক্তি এখনও একটি ফাংশন কল (জন্য অভিধান) একটি যথাযথ গ্রহণ হিসাবে প্রতিনিধিত্ব করা হয় Num
প্রকার। অন্য কথায়, এটি একটি মূল্যহীন থাঙ্ক, এবং আমরা পাই:
> :sprint intlist
_
অন্যদিকে, প্রকারটি নির্দিষ্ট করুন Int
এবং কোডটি সম্পূর্ণ আলাদা:
> let intlist = [[1::Int,2],[2,3]]
==================== Simplified expression ====================
returnIO
(: ((: (: (I# 1#) (: (I# 2#) []))
(: (: (I# 2#) (: (I# 3#) [])) []))
`cast` <Co:6>)
[])
এবং তাই :sprint
আউটপুট হয়:
> :sprint intlist
intlist = [[1,2],[2,3]]
একইভাবে, অক্ষরগুলির আক্ষরিক স্ট্রিং এবং সুস্পষ্ট তালিকার সম্পূর্ণ ভিন্ন উপস্থাপনা রয়েছে:
> let stringlist = ["hi", "there"]
==================== Simplified expression ====================
returnIO
(: ((: (unpackCString# "hi"#) (: (unpackCString# "there"#) []))
`cast` <Co:6>)
[])
> let charlist = [['h','i'], ['t','h','e','r','e']]
==================== Simplified expression ====================
returnIO
(: ((: (: (C# 'h'#) (: (C# 'i'#) []))
(: (: (C# 't'#)
(: (C# 'h'#) (: (C# 'e'#) (: (C# 'r'#) (: (C# 'e'#) [])))))
[]))
`cast` <Co:6>)
[])
এবং :sprint
আউটপুটের পার্থক্যগুলি হ'ল জিএইচসিআই অভিব্যক্তির কোন অংশকে মূল্যায়ন (সুস্পষ্ট :
নির্মাতারা) বনাম অবমূল্যায়ন ( unpackCString#
থাঙ্কস) বিবেচনা করে তার নিদর্শনগুলিকে প্রতিনিধিত্ব করে।