হাস্কেল: কনভেনশন কেন কোনও সহায়ক ফাংশনটির নাম রাখবেন "যান"?


84

আমি goহাস্কেল উপাদান বা উত্স পড়ার সময় অনেক কিছুই দেখতে পাই , তবে আমি এটি সম্পর্কে সত্যই কখনই স্বাচ্ছন্দ্যবোধ করি না - (আমার মনে হয় এটি "মনের মধ্যে" গোটো "এর নেতিবাচক অর্থ আছে)। আমি LYH এর সাথে হাস্কেল শিখতে শুরু করেছিলাম এবং এটিই আমি ব্যবহার করার প্রবণতা accএবং stepভাঁজ লেখার সময় বেছে নিয়েছিলাম । লেখার জন্য সম্মেলনটি goকোথা থেকে এসেছে?

সর্বাধিক গুরুত্বপূর্ণ, নামটি goবোঝানোর কথা ঠিক কী ?


4
আমি সাধারণত loopপরিবর্তে আমার ফাংশন কল ।
21: 23 এ

4
goআমি পড়েছি এমন কোনও হাস্কেল উপাদান কখনও দেখেনি । আপনি একটি উদাহরণ / রেফারেন্স দিতে পারেন?
আয়নু জি স্টান

@ আয়নুț উদাহরণস্বরূপ, গণনা প্যাকেজের ইয়েসড বইয়ের ব্যাখ্যা । (কেন ইয়েসড বইটি আমার জানা না থাকা বিষয়টির জন্য এতগুলি উপাদান উত্সর্গ করে, তবে এটি মূল বিষয়টির পাশে)
ড্যান বার্টন

এটির মূল্যের জন্য, আমি অনেক সি / সি ++ প্রোগ্রামারকে দেখেছি যারা তাদের সহায়তাকারী ফাংশনগুলিকে "যেতে" নামকরণ করে যখন তারা আরও ভাল নাম চিন্তা করতে পারে না।
শ্রীভাতসার

FWIW, সুস্পষ্ট লেজ পুনরাবৃত্তি হ'ল ক্ষয়ক্ষতি সম্ভাবনা সহ অনেক উপায়ে গোটোর কার্যকরী সংস্করণ। স্থির টাইপিং এবং স্কোপিং বিধিগুলি বিভ্রান্তিকে সর্বনিম্ন রাখতে সহায়তা করে। এবং নামটি পছন্দ করার জন্য, আমি দৈর্ঘ্য এবং উপযুক্ততার সম্পর্কে নীচে @ মিশেল স্নোইম্যানের উত্তরটি পছন্দ করি। এছাড়াও, যখন কেবলমাত্র একজন সহায়ক ফাংশন উপস্থিত থাকে তখন এর নামটি বেশিরভাগ ক্ষেত্রে অপ্রাসঙ্গিক বলে মনে হয়, তাই আমি সাধারণত 'গো' বা 'লুপ' বাছাই করি কারণ আমার কিছু বাছাই করতে হয় এবং উভয়ই বোধগম্য হয়। আমি অলস লুপগুলির জন্য 'গো' এবং কঠোরগুলির জন্য "লুপ" পছন্দ করি।
মোকস

উত্তর:


138

হুঁ! কিছু প্রত্নতত্ত্ব!

২০০৪ সাল থেকে আমি goকোনও পুনরাবৃত্ত ক্রিয়াকলাপের কোনও শ্রমিক / মোড়ক রুপান্তরকরণ করার সময় লেজ-পুনরাবৃত্ত কর্মী লুপগুলির জেনেরিক নাম হিসাবে ব্যবহার করেছি । আমি এটি ব্যাপকভাবে ব্যবহার শুরু করেছি bytestring, যেমন

foldr :: (Word8 -> a -> a) -> a -> ByteString -> a
foldr k v (PS x s l) = inlinePerformIO $ withForeignPtr x $ \ptr ->
        go v (ptr `plusPtr` (s+l-1)) (ptr `plusPtr` (s-1))
    where
        STRICT3(go)
        go z p q | p == q    = return z
                 | otherwise = do c  <- peek p
                                  go (c `k` z) (p `plusPtr` (-1)) q -- tail recursive
{-# INLINE foldr #-}

bytestringআগস্ট 2005 সালে ছিল ।

এটি আরডাব্লুএইচ-এ লেখা হয়েছিল এবং সম্ভবত সেখান থেকে জনপ্রিয় হয়েছিল। এছাড়াও, স্ট্রিম ফিউশন লাইব্রেরিতে, ডানকান কাউটস এবং আমি এটি প্রচুর করতে শুরু করেছি।

জিএইচসি সূত্র থেকে

আইডিয়ম যদিও আরও ফিরে যায়। foldrGHC.Base এ দেওয়া হয়:

foldr k z = go
      where
         go []     = z
         go (y:ys) = y `k` go ys

এটি সম্ভবত যেখানে আমি কৌশলটি বেছে নিয়েছি (আমি ভেবেছিলাম এটি এন্ডি গিলের থিসিস থেকে এসেছে তবে goসেখানকার কোনও ব্যবহার খুঁজে পাচ্ছি না )। এটা তোলে নয় , Gofer এই ফর্মটি দেওয়া তাই আমি মনে করি এই প্রথম GHC কোড বেস দেখা যায়।

2001 এর মধ্যে, সাইমন মার্লো goসিস্টেম-লেভেলের কিছু কোড ব্যবহার করছিল , সুতরাং আমরা দোষটি কোথাও জিএইচসিতে রাখতে পারি এবং এই ক্লুটি আমাদের জিএইচসি উত্সের দিকে নিয়ে যায় , যেখানে goকর্মী কার্যক্রমে ব্যাপকভাবে ব্যবহৃত হয়:

myCollectBinders expr
  = go [] expr
  where
    go bs (Lam b e)          = go (b:bs) e
    go bs e@(Note (SCC _) _) = (reverse bs, e)
    go bs (Cast e _)         = go bs e
    go bs (Note _ e)         = go bs e
    go bs e                  = (reverse bs, e)

জিএইচসি 3.02 এবং গ্লাসগো

জিএইচসি-র পুরানো সংস্করণগুলি খনন করে, আমরা দেখতে পাচ্ছি যে জিএইচসি 0.29-এ এই প্রতিমাটি উপস্থিত হয় না, তবে জিএইচসি 3.02 সিরিজ (1998) এর মাধ্যমে goপ্রতিমাটি সর্বত্র প্রদর্শিত হয়। 1996-1997 তারিখে তারিখে Numeric.lhsসংজ্ঞায়িত একটি উদাহরণ showInt:

showInt n r
  | n < 0     = error "Numeric.showInt: can't show negative numbers"
  | otherwise = go n r
    where
     go n r =
      case quotRem n 10 of                 { (n', d) ->
      case chr (ord_0 + fromIntegral d) of { C# c# -> -- stricter than necessary
      let
    r' = C# c# : r
      in
      if n' == 0 then r' else go n' r'
      }}

এটি H98 প্রতিবেদনে প্রদত্ত একটি পৃথক বাস্তবায়ন । বাস্তবায়ন মধ্যে খনক "Numeric.lhs" যাইহোক, আমরা যে এটা যে সংস্করণটি 1997 সালে GHC 2.06 যোগ করা হয়েছিল হিসাবে একই নয়, এবং Sigbjorne Finne থেকে একটি খুব আকর্ষণীয় প্যাচ মনে হচ্ছে, এপ্রিল 1998 সালে একটি যোগ goলুপটি নুমারিক.এলএইচএসে।

এটি বলছে যে কমপক্ষে 1998 এর মধ্যে সিগবজর্ন goজিএইচসি "স্টাডি" লাইব্রেরিতে লুপ যুক্ত করছিল , একই সময়ে, জিএইচসি সংকলক কোরের অনেকগুলি মডিউলgo লুপ ছিল । আরও খনন, জুলাই 1996 সালে উইল পার্টেনের থেকে এই খুব আকর্ষণীয় প্রতিশ্রুতি জিএইচসি-তে একটি "গো" লুপ যুক্ত করেছে - কোডটি সাইমন পিজে থেকে এসেছে যদিও!

তাই আমি এটাকে গ্লাসগোতে উদ্ভাবিত গ্লাসগো আইডিয়ম হিসাবে ডাকতে যাচ্ছি যারা 90 এর দশকের মাঝামাঝি সময়ে সায়মন মার্লো , সিগবজর্ন ফিন , উইল পার্টেন এবং সাইমন পাইটন জোন্স এর মতো জিএইচসি-তে কাজ করেছিলেন ।


4
"লেজ-পুনরাবৃত্ত কর্মী লুপগুলির জেনেরিক নাম" এর জন্য +1 যা আমি দেখেছি বেশিরভাগ ব্যবহারের জন্য সাধারণত সত্য বলে মনে হয়। একটি ফাংশনের জন্য f, আমি ব্যক্তিগতভাবে সাধারণত f'এই ধরণের জিনিসটির নাম হিসাবে ব্যবহার করব , যদিও goকাছাকাছি-কীওয়ার্ড আইডিয়ামটি একটি ধরণের হিসাবে ব্যবহার করার চেষ্টা করা হতে পারে is আকর্ষণীয় লক্ষণীয় যে showIntএকই গার্ড একাধিকবার মূল্যায়ন এড়াতে প্রতিমা ব্যবহার করে।
ড্যান বার্টন

4
বিটিডাব্লু, "নামটি বোঝাতে যাওয়ার পরে ঠিক কী?" আমি এটিতে ইঙ্গিত করব gotoএবং কোনও সহায়ক ফাংশনে নিয়ন্ত্রণ হস্তান্তর করার সময় বলব ।
ডন স্টুয়ার্ট

26
আমার অস্পষ্ট স্মৃতিচারণটি হ'ল এটি সাইমন পিজে-ইসম। আমি loopইতিমধ্যে goকনভেনশনটি ব্যবহার করে এমন কোডটি সংশোধন না করে ব্যবহার করার প্রবণতা রাখছি । আমি সবসময় ভেবেছিলাম এটির অর্থ আক্ষরিক অর্থে "গো" হওয়া, যেমন "লুপের চারপাশে যান"।
সাইমন মার্লো

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

4
আমি বিশ্বাস করি এর উত্স হ্যাস্কেলকে পূর্বাভাস দেয়। চলতে চলতে একটি জনপ্রিয় নাম নামকরণ (স্কিম দেয় google.com/... , google.com/search?q=scheme+%22let+go%22+-let's+car+cdr )
AtnNn

17

স্পষ্টতই ডনের উত্তরটি সঠিক। আমাকে কেবল একটি ছোট বিবরণ যুক্ত করতে দিন (যেহেতু এটি আমার লেখার মতো বলে মনে হচ্ছে যে আপনি সরাসরি উল্লেখ করছেন): যান চমৎকার কারণ এটি কেবল দুটি অক্ষর।

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


6
+1 "যান" মাত্র 2 টি অক্ষর (এবং এখনও অর্থবহ) হ'ল এমন একটি সত্য যা কম-প্রশংসা করা সহজ। যখন আমি ইয়েসড বইয়ের "গো" ব্যবহার সম্পর্কে মন্তব্য করেছি (যা এই উদাহরণগুলির জন্য একটি দুর্দান্ত নাম পছন্দ ছিল, ইমো ), আমি আসলে একটি স্ট্যাকওভারফ্লো উত্তরটি পড়ছিলাম যখন "গো" ব্যবহার করা হয়েছিল যখন আমার মনে হয়েছিল আমার প্রশ্ন জিজ্ঞাসা করা উচিত। আমি তত্ক্ষণাত ইয়াসোদ বইয়ের উদাহরণটি মনে রাখলাম, যদিও এটি স্মরণীয় ছিল। ভাল জিনিস!
ড্যান বার্টন

11

আমি এই প্রবাদটি কেবল লিনিয়ার স্ট্রাকচার (এবং তাই "লুপস") নয়, শাখা (গাছের মতো) কাঠামোর ক্ষেত্রেও প্রযোজ্য বলে আশা করব।

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


আমি মনে করি যে এটি উল্লেখ করা বহন করে যে প্রায়শই সহজ কারণগুলির জন্য এই ফাংশনগুলির জন্য ভাল নামগুলি নিয়ে আসা কঠিন কারণ তারা সাধারণত একটি ঘেরের ব্যবস্থায় ভেরিয়েবলগুলি উল্লেখ করে এবং তাই সত্যই সম্পূর্ণ হয় না। একটি বর্ণনামূলক নাম সম্ভবত নিরীহ দেখাচ্ছে: কিছু add_xবা মত consOnto_xs
ডিফিউয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.