দুর্বল মাথা সাধারণ ফর্ম কি?


290

কী দুর্বল হেড সাধারন ফরম (WHNF) এর অর্থ কি? কী হেড সাধারন ফর্ম (HNF) এবং সাধারন ফরম (এন এফ) এর অর্থ কি?

রিয়েল ওয়ার্ল্ড হাস্কেল বলেছেন:

পরিচিত সিক ফাংশনটি আমরা হেডকে সাধারণ ফর্ম (সংক্ষেপিত এইচএনএফ) হিসাবে অভিহিত করি। এটি বাহ্যতম নির্মাণকারী ("মাথা") এর কাছে পৌঁছে একবার থামে। এটি স্বাভাবিক ফর্ম (এনএফ) থেকে পৃথক, যেখানে একটি অভিব্যক্তি সম্পূর্ণ মূল্যায়ন করা হয়।

আপনি হাসকেল প্রোগ্রামারদের দুর্বল মাথা স্বাভাবিক ফর্ম (ডাব্লুএইচএনএফ) উল্লেখ করে শুনবেন। সাধারণ তথ্যের জন্য, দুর্বল মাথা স্বাভাবিক ফর্মটি মাথার স্বাভাবিক ফর্মের মতো। পার্থক্যটি কেবল ফাংশনগুলির জন্যই উত্থাপিত হয় এবং আমাদের এখানে উদ্বেগের পক্ষে খুব অচল।

আমি কয়েকটি সংস্থান এবং সংজ্ঞা পড়েছি ( হাস্কেল উইকি এবং হাস্কেল মেল তালিকা এবং ফ্রি ডিকশনারি ) পড়েছি তবে আমি তা পাই না। কেউ সম্ভবত একটি উদাহরণ দিতে পারেন বা একটি সাধারণ ব্যক্তির সংজ্ঞা দিতে পারেন?

আমি অনুমান করছি যে এটির মতো হবে:

WHNF = thunk : thunk

HNF = 0 : thunk 

NF = 0 : 1 : 2 : 3 : []

কিভাবে seqএবং($!) ডাব্লুএইচএনএফ এবং এইচএনএফ সম্পর্কিত?

হালনাগাদ

আমি এখনও বিভ্রান্ত আমি জানি কিছু উত্তর HNF উপেক্ষা করতে বলে। বিভিন্ন সংজ্ঞা পড়া থেকে মনে হয় ডাব্লুএইচএনএফ এবং এইচএনএফ-এ নিয়মিত ডেটার মধ্যে কোনও পার্থক্য নেই। যাইহোক, এটি কোনও ফাংশনে আসে বলে মনে হয় কোনও পার্থক্য রয়েছে। যদি কোনও পার্থক্য না থাকে তবে কেন seqপ্রয়োজন necessaryfoldl' ?

বিভ্রান্তির আরেকটি বিষয় হ্যাস্কেল উইকির, যা জানিয়েছে যে seqডাব্লুএইচএনএফ-এ হ্রাস পেয়েছে এবং নীচের উদাহরণটিতে কিছুই করবে না। তারপরে তারা বলে যে seqমূল্যায়নকে বাধ্য করার জন্য তাদের ব্যবহার করতে হবে। এটি কি এইচএনএফকে বাধ্য করছে না?

সাধারণ নবাগত স্ট্যাক উপচে পড়া কোড:

myAverage = uncurry (/) . foldl' (\(acc, len) x -> (acc+x, len+1)) (0,0)

যে লোকেরা সিক এবং দুর্বল মাথা স্বাভাবিক ফর্ম (WHNF) বোঝে তারা অবিলম্বে বুঝতে পারে যে এখানে কী ভুল হয় goes (acc + x, লেন + 1) ইতিমধ্যে WHNF এ রয়েছে, সুতরাং সিক, যা কোনও মানকে whnf হ্রাস করে, এতে কিছুই করে না। এই কোডটি মূল ভাঁজের উদাহরণের মতো থঙ্কস তৈরি করবে, তারা কেবল একটি টিউপলের অভ্যন্তরে থাকবে। সমাধানটি কেবলমাত্র টিউপলের উপাদানগুলিকে জোর করা, যেমন

myAverage = uncurry (/) . foldl' 
          (\(acc, len) x -> acc `seq` len `seq` (acc+x, len+1)) (0,0)

- স্ট্যাকওভারফ্লোতে হাস্কেল উইকি


1
সাধারণত আমরা ডাব্লুএইচএনএফ এবং আরএনএফের কথা বলি। (আরএনএফ যাঁকে আপনি এনএফ বলছেন)
বিকল্প

5
@ মোনাডিক আরএনএফ-এর আর কী দাঁড়ায়?
ডেভ 4420

7
@ ডেভ 4420: হ্রাস
মার্চ

উত্তর:


399

আমি সহজ ভাষায় ব্যাখ্যা দেওয়ার চেষ্টা করব। অন্যরা যেমন উল্লেখ করেছে, মাথা স্বাভাবিক ফর্মটি হাস্কেলের ক্ষেত্রে প্রযোজ্য না, তাই আমি এটি এখানে বিবেচনা করব না।

সাধারণ ফর্ম

সাধারণ ফর্মের একটি এক্সপ্রেশন সম্পূর্ণরূপে মূল্যায়ন করা হয় এবং কোনও উপ-এক্সপ্রেশনকে আর মূল্যায়ন করা যায়নি (যেমন এটির কোনও মূল্যায়ন-বিশিষ্ট অংশ নেই)।

এই অভিব্যক্তিগুলি সমস্ত স্বাভাবিক আকারে:

42
(2, "hello")
\x -> (x + 1)

এই অভিব্যক্তিগুলি স্বাভাবিক আকারে নয়:

1 + 2                 -- we could evaluate this to 3
(\x -> x + 1) 2       -- we could apply the function
"he" ++ "llo"         -- we could apply the (++)
(1 + 1, 2 + 2)        -- we could evaluate 1 + 1 and 2 + 2

দুর্বল মাথা স্বাভাবিক ফর্ম

দুর্বল মাথা স্বাভাবিক ফর্মের একটি অভিব্যক্তি বহিরাগত ডেটা কনস্ট্রাক্টর বা ল্যাম্বদা অ্যাবস্ট্রাকশন ( মাথা ) থেকে মূল্যায়ন করা হয়েছে । সাব-এক্সপ্রেশন মূল্যায়ন করা হতে পারে বা নাও হতে পারে । অতএব, প্রতিটি স্বাভাবিক ফর্ম প্রকাশটি দুর্বল মাথার স্বাভাবিক আকারেও থাকে, যদিও বিপরীতটি সাধারণভাবে ধারণ করে না।

কোনও অভিব্যক্তি দুর্বল মাথা স্বাভাবিক আকারে আছে কিনা তা নির্ধারণ করতে, আমাদের কেবলমাত্র অভিব্যক্তির বাইরের অংশটি দেখতে হবে। যদি এটি ডেটা কনস্ট্রাক্টর বা ল্যাম্বডা হয় তবে এটি দুর্বল মাথার স্বাভাবিক আকারে। এটি যদি কোনও ফাংশন অ্যাপ্লিকেশন হয় তবে তা নয়।

এই অভিব্যক্তিগুলি দুর্বল মাথা স্বাভাবিক আকারে:

(1 + 1, 2 + 2)       -- the outermost part is the data constructor (,)
\x -> 2 + 2          -- the outermost part is a lambda abstraction
'h' : ("e" ++ "llo") -- the outermost part is the data constructor (:)

উল্লিখিত হিসাবে, উপরে উল্লিখিত সমস্ত সাধারণ ফর্ম এক্সপ্রেশনগুলিও দুর্বল মাথা স্বাভাবিক ফর্মে।

এই অভিব্যক্তিগুলি দুর্বল মাথা স্বাভাবিক আকারে নয়:

1 + 2                -- the outermost part here is an application of (+)
(\x -> x + 1) 2      -- the outermost part is an application of (\x -> x + 1)
"he" ++ "llo"        -- the outermost part is an application of (++)

স্ট্যাক ওভারফ্লোস

দুর্বল মাথা স্বাভাবিক ফর্ম একটি অভিব্যক্তি মূল্যায়নের জন্য অন্যান্য এক্সপ্রেশন প্রথমে ডাব্লুএনএইচএফ মূল্যায়ন করা প্রয়োজন হতে পারে। উদাহরণস্বরূপ, 1 + (2 + 3)ডাব্লুএইচএনএফকে মূল্যায়ন করার জন্য, আমাদের প্রথমে মূল্যায়ন করতে হবে 2 + 3। যদি কোনও একক অভিব্যক্তি মূল্যায়নের ফলে নেস্টেড এই মূল্যায়নের অনেকগুলি বাড়ে, ফলাফলটি স্ট্যাকের ওভারফ্লো।

এটি ঘটে যখন আপনি একটি বৃহত্তর অভিব্যক্তি তৈরি করেন যা কোনও ডেটা কনস্ট্রাক্টর বা ল্যাম্বডাস উত্পাদন করে না যতক্ষণ না এর একটি বড় অংশ মূল্যায়ন না করা হয়। এগুলি প্রায়শই এই ধরণের ব্যবহারের কারণে ঘটে foldl:

foldl (+) 0 [1, 2, 3, 4, 5, 6]
 = foldl (+) (0 + 1) [2, 3, 4, 5, 6]
 = foldl (+) ((0 + 1) + 2) [3, 4, 5, 6]
 = foldl (+) (((0 + 1) + 2) + 3) [4, 5, 6]
 = foldl (+) ((((0 + 1) + 2) + 3) + 4) [5, 6]
 = foldl (+) (((((0 + 1) + 2) + 3) + 4) + 5) [6]
 = foldl (+) ((((((0 + 1) + 2) + 3) + 4) + 5) + 6) []
 = (((((0 + 1) + 2) + 3) + 4) + 5) + 6
 = ((((1 + 2) + 3) + 4) + 5) + 6
 = (((3 + 3) + 4) + 5) + 6
 = ((6 + 4) + 5) + 6
 = (10 + 5) + 6
 = 15 + 6
 = 21

লক্ষ করুন যে কীভাবে এটি গভীরভাবে যেতে হবে তার আগে এটি দুর্বল মাথাটিকে স্বাভাবিক আকারে ফেলে।

আপনি ভাবতে পারেন, হাস্কেল কেন আগে সময়ের অভ্যন্তরীণ ভাবগুলি কমায় না? এটি হাস্কেলের অলসতার কারণে। যেহেতু এটি সাধারণভাবে অনুমান করা যায় না যে প্রতিটি সূক্ষ্ম এক্সপ্রেশন প্রয়োজন হবে, তাই এক্সপ্রেশনগুলি বাইরে থেকে মূল্যায়ন করা হয়।

(জিএইচসির একটি কঠোরতা বিশ্লেষক রয়েছে যা এমন কিছু পরিস্থিতি সনাক্ত করতে পারে যেখানে একটি subexpression সবসময় প্রয়োজন হয় এবং এটি এর আগে সময়ের আগে এটি মূল্যায়ন করতে পারে This তবে এটি কেবলমাত্র একটি অপ্টিমাইজেশন, তবে আপনাকে ওভারফ্লো থেকে রক্ষা করার জন্য এটির উপর নির্ভর করা উচিত নয়)।

অন্যদিকে, এই ধরণের অভিব্যক্তি সম্পূর্ণ নিরাপদ:

data List a = Cons a (List a) | Nil
foldr Cons Nil [1, 2, 3, 4, 5, 6]
 = Cons 1 (foldr Cons Nil [2, 3, 4, 5, 6])  -- Cons is a constructor, stop. 

এই বৃহত্তর অভিব্যক্তিগুলি তৈরি করা এড়াতে যখন আমরা জানি যে সমস্ত স্যুপ এক্সপ্রেসনগুলি মূল্যায়ন করতে হবে, আমরা অভ্যন্তরীণ অংশগুলি সময়ের আগে মূল্যায়ন করতে বাধ্য করতে চাই।

seq

seqহ'ল একটি বিশেষ ফাংশন যা মূল্যায়ন করার জন্য অভিব্যক্তিগুলিকে বাধ্য করার জন্য ব্যবহৃত হয়। এর শব্দার্থবিজ্ঞানের seq x yঅর্থ হ'ল যখনই yদুর্বল মাথার স্বাভাবিক ফর্মকে xমূল্যায়ন করা হয় তখন দুর্বল মাথার স্বাভাবিক ফর্মকেও মূল্যায়ন করা হয়।

এটি সংজ্ঞা হিসাবে ব্যবহৃত অন্যান্য জায়গাগুলির মধ্যে foldl', এর কঠোর রূপ foldl

foldl' f a []     = a
foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs

প্রতিটি পুনরাবৃত্তি foldl'সঞ্চালককে ডাব্লুএইচএনএফ-তে বাধ্য করে। এটি এটির ফলে একটি বৃহত্তর অভিব্যক্তি তৈরি করা এড়ানো যায় এবং তাই এটি স্ট্যাককে উপচে পড়া এড়ানো।

foldl' (+) 0 [1, 2, 3, 4, 5, 6]
 = foldl' (+) 1 [2, 3, 4, 5, 6]
 = foldl' (+) 3 [3, 4, 5, 6]
 = foldl' (+) 6 [4, 5, 6]
 = foldl' (+) 10 [5, 6]
 = foldl' (+) 15 [6]
 = foldl' (+) 21 []
 = 21                           -- 21 is a data constructor, stop.

তবে হাস্কেলউইকির উদাহরণ হিসাবে উল্লেখ করা হয়েছে, এটি সমস্ত ক্ষেত্রে আপনাকে রক্ষা করতে পারে না, কারণ সঞ্চয়ের শুধুমাত্র ডাব্লুএইচএনএফকে মূল্যায়ন করা হয়। উদাহরণে, সঁচায়ক তাই এটি শুধুমাত্র tuple কন্সট্রাকটর মূল্যায়ন, এবং বাধ্য করা হবে, একটি tuple হয় accবা len

f (acc, len) x = (acc + x, len + 1)

foldl' f (0, 0) [1, 2, 3]
 = foldl' f (0 + 1, 0 + 1) [2, 3]
 = foldl' f ((0 + 1) + 2, (0 + 1) + 1) [3]
 = foldl' f (((0 + 1) + 2) + 3, ((0 + 1) + 1) + 1) []
 = (((0 + 1) + 2) + 3, ((0 + 1) + 1) + 1)  -- tuple constructor, stop.

এটি এড়াতে, আমাদের অবশ্যই এটি তৈরি করতে হবে যাতে টিউপল কনস্ট্রাক্টর মূল্যায়নের জন্য accএবং এর মূল্যায়ন জোর করে len। আমরা এটি ব্যবহার করে করি seq

f' (acc, len) x = let acc' = acc + x
                      len' = len + 1
                  in  acc' `seq` len' `seq` (acc', len')

foldl' f' (0, 0) [1, 2, 3]
 = foldl' f' (1, 1) [2, 3]
 = foldl' f' (3, 2) [3]
 = foldl' f' (6, 3) []
 = (6, 3)                    -- tuple constructor, stop.

31
মাথা স্বাভাবিক ফর্মের জন্য ল্যাম্বার শরীরের পাশাপাশি হ্রাস হওয়া প্রয়োজন, যখন দুর্বল মাথা স্বাভাবিক ফর্মের এই প্রয়োজন হয় না। সুতরাং \x -> 1 + 1WHNF কিন্তু HNF হয়।
হামার

উইকিপিডিয়া জানিয়েছে যে এইচএনএফ হ'ল "[একটি] শর্তটি স্বাভাবিক অবস্থায় রয়েছে যদি মাথা অবস্থানে কোনও বিটা-রেডেক্স না থাকে"। হাস্কেল কি "দুর্বল" কারণ এটি বিটা-রিডেক্স উপ-এক্সপ্রেশনগুলি না?

কীভাবে কঠোর ডেটা কনস্ট্রাক্টররা নাটকে আসবেন? তারা কি seqতাদের যুক্তি আহ্বানের মতো ?
বার্গি

1
@ ক্যাপ্টেইনববিশ: 1 + 2 NF বা ডাব্লুএইচএনএফ নয়। এক্সপ্রেশন সর্বদা একটি সাধারণ ফর্ম হয় না।
হামার

2
@ জোড়োবা: ফলাফলটি মুদ্রণের জন্য, জিএইচসিআই কেবলমাত্র ডাব্লুএইচএনএফ-র কাছে নয়, এনএফ-এর কাছে সম্পূর্ণরূপে অভিব্যক্তিটি মূল্যায়ন করে। দুটি বৈকল্পিকের মধ্যে পার্থক্য জানানোর একটি উপায় হ'ল মেমরির পরিসংখ্যানগুলির সাথে সক্ষম করা :set +s। তারপরে আপনি দেখতে পাচ্ছেন যে foldl' fএর চেয়ে বেশি বরাদ্দ শেষ হয়foldl' f'
হামার

43

বিভাগে Thunks এবং দুর্বল হেড সাধারন ফরম Haskell, উইকিবই মধ্যে আলস্য বর্ণনা এই সহায়ক চিত্রাঙ্কন সহ WHNF একটি খুব ভাল বিবরণ প্রদান করে:

ধাপে ধাপে মূল্য (4, [1, 2]) মূল্যায়ন করা।  প্রথম পর্যায়ে সম্পূর্ণভাবে মূল্যহীন;  পরবর্তী সমস্ত ফর্মগুলি ডাব্লুএইচএনএফ-এ রয়েছে, এবং শেষটিও স্বাভাবিক আকারে।

ধাপে ধাপে মূল্য (4, [1, 2]) মূল্যায়ন করা। প্রথম পর্যায়ে সম্পূর্ণভাবে মূল্যহীন; পরবর্তী সমস্ত ফর্মগুলি ডাব্লুএইচএনএফ-এ রয়েছে, এবং শেষেরটিও স্বাভাবিক আকারে।


5
আমি জানি লোকেরা মাথা স্বাভাবিক ফর্ম উপেক্ষা করতে বলে, কিন্তু আপনি কি এই চিত্রটিতে একটি উদাহরণ দিতে পারেন যা আপনার মাথা স্বাভাবিকের মতো লাগে?
সিএমসিডিগ্রাগনকাই

28

হাস্কেল প্রোগ্রামগুলি হল এক্সপ্রেশন এবং এগুলি মূল্যায়ন করে চালিত হয়

একটি অভিব্যক্তি মূল্যায়ন করতে, সমস্ত ফাংশন অ্যাপ্লিকেশনগুলি তাদের সংজ্ঞা দ্বারা প্রতিস্থাপন করুন। আপনি যে ক্রমটিতে এটি করছেন সেটি খুব বেশি গুরুত্ব দেয় না, তবে এটি এখনও গুরুত্বপূর্ণ: বহিরাগত প্রয়োগ দিয়ে শুরু করুন এবং বাম থেকে ডানে এগিয়ে যান; একে অলস মূল্যায়ন বলা হয়

উদাহরণ:

   take 1 (1:2:3:[])
=> { apply take }
   1 : take (1-1) (2:3:[])
=> { apply (-)  }
   1 : take 0 (2:3:[])
=> { apply take }
   1 : []

প্রতিস্থাপনের জন্য আর কোনও কার্যকারিতা অ্যাপ্লিকেশন না থাকলে মূল্যায়ন বন্ধ হয়। ফলাফলটি সাধারণ আকারে (বা হ্রাস স্বাভাবিক ফর্ম , আরএনএফ)। আপনি কোন ক্রমটি কোনও অভিব্যক্তিকে মূল্যায়ন করেন তা বিবেচনা না করে আপনি সর্বদা একই সাধারণ ফর্মটি দিয়ে শেষ করবেন (তবে কেবল মূল্যায়ন শেষ হলে)।

অলস মূল্যায়নের জন্য কিছুটা আলাদা বর্ণনা রয়েছে। যথা, এটি বলে যে আপনি কেবল দুর্বল মাথা সাধারণ ফর্ম থেকে সবকিছু মূল্যায়ন করা উচিত । ডাব্লুএইচএনএফ-তে প্রকাশের জন্য ঠিক তিনটি কেস রয়েছে:

  • একজন নির্মাতা: constructor expression_1 expression_2 ...
  • খুব কম আর্গুমেন্ট সহ একটি অন্তর্নির্মিত ফাংশন, যেমন (+) 2বাsqrt
  • একটি ল্যাম্বডা-এক্সপ্রেশন: \x -> expression

অন্য কথায়, অভিব্যক্তির প্রধান (অর্থাত্ বাহ্যতমতম ফাংশন অ্যাপ্লিকেশন) এর পরে আর মূল্যায়ন করা যায় না, তবে ফাংশন যুক্তিতে অমূল্য এক্সপ্রেশন থাকতে পারে।

ডাব্লুএইচএনএফ এর উদাহরণ:

3 : take 2 [2,3,4]   -- outermost function is a constructor (:)
(3+1) : [4..]        -- ditto
\x -> 4+5            -- lambda expression

মন্তব্য

  1. ডাব্লুএইচএনএফ-এর "প্রধান" কোনও তালিকার প্রধানকে উল্লেখ করে না, তবে বহিরাগততম ফাংশন অ্যাপ্লিকেশনটিকে বোঝায়।
  2. কখনও কখনও, লোকেরা অবমূল্যায়িত অভিব্যক্তিগুলিকে "থঙ্কস" বলে ডাকে তবে আমি এটি বোঝার পক্ষে এটি ভাল উপায় বলে মনে করি না।
  3. হেড নর্মাল ফর্ম (এইচএনএফ) হাস্কেলের পক্ষে অপ্রাসঙ্গিক। এটি ডাব্লুএইচএনএফ থেকে পৃথক যে ল্যাম্বডা এক্সপ্রেশনগুলির মৃতদেহগুলিও কিছুটা মূল্যায়ন করা হয়।

ব্যবহার seqমধ্যে foldl'বল WHNF থেকে HNF মূল্যায়ন?

1
@ এসএনএমসিডোনাল্ড: না, হাস্কেল এইচএনএফ ব্যবহার করে না। মূল্যায়ন দ্বিতীয় এক্সপ্রেশন মূল্যায়নের আগে ডাব্লুএইচএনএফের কাছে seq expr1 expr2প্রথম অভিব্যক্তিটি মূল্যায়ন করবে । expr1expr2
হেইনরিচ এপেলফাস

26

উদাহরণ সহ একটি ভাল ব্যাখ্যা দেওয়া আছে http://foldoc.org/Weak+Head+ সাধারণ + ফর্ম হেড সাধারণ ফর্ম একটি ফাংশন বিমূর্তির ভিতরে একটি অভিব্যক্তির বিট এমনকি সরল করে তোলে, যখন "দুর্বল" মাথা স্বাভাবিক ফর্ম ফাংশন বিমূর্তিতে থামে ।

উত্স থেকে, যদি আপনি:

\ x -> ((\ y -> y+x) 2)

এটি দুর্বল মাথা স্বাভাবিক ফর্মের মধ্যে রয়েছে তবে সাধারণ ফর্ম নয় ... কারণ সম্ভাব্য অ্যাপ্লিকেশনটি এমন কোনও ফাংশনের ভিতরে আটকে আছে যা এখনও মূল্যায়ন করা যায় না।

আসল মাথা স্বাভাবিক ফর্ম দক্ষতার সাথে প্রয়োগ করা কঠিন হবে। এটি ফাংশন ভিতরে প্রায় poking প্রয়োজন হবে। সুতরাং দুর্বল মাথা স্বাভাবিক ফর্মের সুবিধা হ'ল আপনি এখনও একটি অস্বচ্ছ ধরণের হিসাবে ফাংশনগুলি প্রয়োগ করতে পারেন এবং তাই এটি সংকলিত ভাষা এবং অপ্টিমাইজেশানের সাথে আরও সুসংগত।


12

ডাব্লুএইচএনএফ চায় না ল্যাম্বডাসের শরীরের মূল্যায়ন হোক, তাই

WHNF = \a -> thunk
HNF = \a -> a + c

seq তার প্রথম যুক্তিটি ডাব্লুএইচএনএফ-এ থাকতে চায়

let a = \b c d e -> (\f -> b + c + d + e + f) b
    b = a 2
in seq b (b 5)

মূল্যায়ন

\d e -> (\f -> 2 + 5 + d + e + f) 2

পরিবর্তে, কি এইচএনএফ ব্যবহার করা হবে

\d e -> 2 + 5 + d + e + 2

অথবা আমি উদাহরণটি ভুল বুঝেছি, বা আপনি ডাব্লুএইচএনএফ এবং এইচএনএফ-তে 1 এবং 2 মেশান।
ঝেন

5

মূলত, ধরুন আপনার কাছে কিছু প্রকারের থন্ড রয়েছে t

এখন, আমরা যদি tডাব্লুএইচএনএফ বা এনএইচএফকে মূল্যায়ন করতে চাই, যা ফাংশন ব্যতীত একই, তবে আমরা দেখতে পাই যে আমরা এর মতো কিছু পেয়েছি

t1 : t2কোথায় t1এবং t2থ্যাঙ্কস এই ক্ষেত্রে, t1হবে আপনার 0(অথবা বরং করার জন্য একটি thunk 0দেওয়া কোন অতিরিক্ত আনবক্সিং)

seqএবং $!ডাব্লুএইচএনএফকে ব্যাখ্যা করুন। মনে রাখবেন যে

f $! x = seq x (f x)

1
@ এসএনএমসিডোনাল্ড এইচএনএফ উপেক্ষা করুন। seq বলে যে এটি যখন ডাব্লুএইচএনএফ-তে মূল্যায়ন করা হয়, ডাব্লুএইচএনএফ-এর কাছে প্রথম যুক্তিটি মূল্যায়ন করুন।
বিকল্প
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.