হাস্কেলস দুর্বল প্রধান ফর্ম


9

আমি কিছু বিরক্তিকর জিনিস নিয়ে হোঁচট খেয়েছি। আমি জানি যে হ্যাশেল দুর্বল মাথা স্বাভাবিক ফর্ম (ডাব্লুএইচএনএফ) এর সাথে কাজ করে এবং আমি জানি এটি কী। নিম্নলিখিত কোডটি জিসিসি তে টাইপ করা (আমি কমান্ডটি ব্যবহার করছি: স্প্রিন্ট যা ডাব্লুএইচএনএফের কাছে আমার জ্ঞানের সাথে অভিব্যক্তি হ্রাস করে)):

let intlist = [[1,2],[2,3]]
:sprint intlist

এটি intlist = _আমাকে পুরোপুরি বোঝায়।

let stringlist = ["hi","there"]
:sprint stringlist 

দেয় stringlist = [_,_] এটি ইতিমধ্যে আমাকে বিভ্রান্ত করে। কিন্তু তারপর:

let charlist = [['h','i'], ['t','h','e','r','e']]
:sprint charlist

আশ্চর্যজনকভাবে দেয় charlist = ["hi","there"]

যতদূর আমি হাস্কেলকে বুঝতে পেরেছি, স্ট্রিংগুলি চরগুলির তালিকাগুলি ছাড়া আর কিছুই নয়, যা প্রকারভেদে "hi" :: [Char]এবং পরীক্ষা করে নিশ্চিত হয়ে গেছে বলে মনে হয় ['h','i'] :: [Char]

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

ধন্যবাদ


এটি সম্পর্কিত বলে মনে হচ্ছে
বার্গি

@ বার্গি এই প্রশ্নগুলি অবশ্যই সম্পর্কিত, তবে কেন "bla"এবং ['b','l','a']আলাদাভাবে বেরিয়ে আসবে সেদিকেও তেমন সমাধান করার কথা মনে হচ্ছে না ।
বাম দিকের বাইরে

@ বামফেরাআউন্ডবাউট কারণ "bla"ওভারলোড করা যায়, তবে ['b','l','a']এটি একটি String/ হিসাবে পরিচিত [Char]?
বার্গি

1
@ বেরগি আমি সে সম্পর্কেও ভেবেছিলাম, তবে এটি সত্যিকারের প্রশংসনীয় নয় কারণ এটি অতিরিক্ত ওভারলোডও করা ['b', 'l', 'a']যেতে পারে , এবং একইভাবে চালু "bla"করা থাকলে কেবল ওভারলোড করা -XOverloadedStringsহবে।
বাম দিকের বাইরে

2
পার্সার-সম্পর্কিত বলে মনে হচ্ছে, সম্ভবত জিএইচসিআই-তে নির্দিষ্ট? (আপনি কীভাবে জিএইচসি-সংকলিত কোডে ডাব্লুএইচএনএফ-এর জন্য পরীক্ষা করেন তা আমি জানি না)) উদ্ধৃতিগুলি এগুলি ট্রিগার বলে মনে হয়।
chepner

উত্তর:


5

দ্রষ্টব্য যে ডাব্লুএইচএনএফ-তে কোনও অভিব্যক্তি হ্রাস :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#থাঙ্কস) বিবেচনা করে তার নিদর্শনগুলিকে প্রতিনিধিত্ব করে।

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