ভাঁজে কার্যকরী যুক্তির নাম কী


10

উচ্চতর ক্রম ফাংশনে ভাঁজ / কার্যকরী আর্গুমেন্টের নাম, যদি কোনও হয় তবে কী?

আমি একটি মোনাডিক টাবুলার প্রসেসিং লাইব্রেরিতে কাজ করছি যেখানে সরল বিশ্লেষণগুলি তৈরি করার জন্য সারিগুলি ভাঁজ করা হয় (যেমন কোনও কলামের ন্যূনতম, সর্বাধিক, গড় অনুসন্ধান)। সুতরাং আমি foldফাংশনটির তর্কের পক্ষে একটি দৃ name় নাম এবং এমএল সম্প্রদায়ের (বা দ্বিতীয় এবং তৃতীয় প্রার্থী হিসাবে হাস্কেল বা কমন লিস্প) সুপ্রতিষ্ঠিত যে কোনও নাম আকর্ষণীয় হবে।

মত একটি নাম ফাংশন fবর্ণনায় সাধারণ fold, এটি অবশ্য বর্ণনামূলক এবং একটি বিশেষ্য আরও উপযুক্ত হবে।


10
একটিও নেই প্রকৃতপক্ষে, ছত্রাকজনিত (ভাঁজ) এর জন্য সর্বজনীনভাবে ব্যবহৃত নামও নেই
ড্যানিয়েল গ্র্যাটজার

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

7
@ রবার্টহারভে এটি কোনও পরীক্ষার প্রশ্ন (?) বা একই রকম কিছু নয়। প্রোগ্রামার হিসাবে, আমি মনে করি যে প্রোগ্রামিং অবজেক্টের (প্রকার, ভেরিয়েবল ইত্যাদি) জন্য ভাল নাম নির্বাচন করা খুব গুরুত্বপূর্ণ। এবং যদি কিছু জিনিসগুলির একটি সুপরিচিত নাম থাকে, তবে এটি অজ্ঞতা থেকে দূরে রেখে, এটি ব্যবহার না করার কোনও কারণ নেই এবং এটিই প্রশ্নগুলির জন্য।
ব্যবহারকারী 40989

9
@ ইজকাটা না, এটি ভুল। একটি উচ্চতর ক্রম ফাংশন একটি ফাংশন যা একটি ফাংশন গ্রহণ করে। foldএকটি উচ্চতর অর্ডার ফাংশন। ভাঁজ করার যুক্তিটি কেবল একটি, একটি যুক্তি
ড্যানিয়েল গ্রেটজার

1
@ জোজেফগ এটি আপনার মন্তব্যের দ্বিতীয় অংশের প্রতিক্রিয়া হিসাবে। প্রথম অংশ হিসাবে (এবং প্রশ্ন), মেটাতে আমার পোস্ট দেখুন। এদেরকে প্রক্রিয়াজাতীয় পরামিতি বলা হয়।
ইজকাটা

উত্তর:


8

@ জোজেফগ উল্লিখিত হিসাবে এর কোনও উত্তর নেই কিনা আমি জানি না। এবং তাই খাঁটি জল্পনা থেকে, এখানে একটি সম্ভাব্য ব্যাখ্যা:

আমি সন্দেহ কারণ নেই কারণ টাইপ - (a -> b -> b)মধ্যে Haskell, এরfoldr - উদাহরণস্বরূপ, যেকোনো নাম এক সঙ্গে আসা পর্যন্ত হতে পারে তুলনায় আরো অর্থবহ। যেহেতু aএবং bটাইপ পরামিতি যে কোনও কিছু হতে পারে , ফাংশনটি পাশাপাশি বেশ কিছু করতে পারে । তোমার মত নামের সাথে বাম করছি যাতে করে function, combiner, morphism, এবং argument, বিশেষ করে অর্থপূর্ণ হয় না যা। পাশাপাশি একটি সংক্ষিপ্ত, বিভ্রান্তিকর নাম ব্যবহার করতে পারে।

আর একটি উদাহরণ id :: a -> aফাংশন: আপনার যুক্তিটি কী বলা উচিত? আবার, আমি মনে করি idএর প্রকারটি তার যুক্তির নামের চেয়ে বর্ণনামূলক।

তবে, আমি আপনার সাথে একমত - মনে হচ্ছে একটি সাধারণ নাম থাকতে হবে, সম্ভবত গণিতে। আমি আশা করি কেউ এ সম্পর্কে আমাকে সংশোধন করতে পারে।


রিয়েল কোডে এর নামের কয়েকটি উদাহরণ:

ইন Haskell, এর লাইব্রেরি , এটা বেশিরভাগ বলা হচ্ছে f(এবং কখনও কখনও operatorমন্তব্য):

class Foldable t where
    -- | Map each element of the structure to a monoid,
    -- and combine the results.
    foldMap :: Monoid m => (a -> m) -> t a -> m
    foldMap f = foldr (mappend . f) mempty

    -- | Right-associative fold of a structure.
    --
    -- @'foldr' f z = 'Prelude.foldr' f z . 'toList'@
    foldr :: (a -> b -> b) -> b -> t a -> b
    foldr f z t = appEndo (foldMap (Endo . f) t) z

    -- | Right-associative fold of a structure, 
    -- but with strict application of the operator.
    foldr' :: (a -> b -> b) -> b -> t a -> b
    foldr' f z0 xs = foldl f' id xs z0
      where f' k x z = k $! f x z

    -- | Left-associative fold of a structure.
    --
    -- @'foldl' f z = 'Prelude.foldl' f z . 'toList'@
    foldl :: (a -> b -> a) -> a -> t b -> a
    foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z

    -- | Left-associative fold of a structure.
    -- but with strict application of the operator.
    --
    -- @'foldl' f z = 'List.foldl'' f z . 'toList'@
    foldl' :: (a -> b -> a) -> a -> t b -> a
    foldl' f z0 xs = foldr f' id xs z0
      where f' x k z = k $! f z x

    -- | A variant of 'foldr' that has no base case,
    -- and thus may only be applied to non-empty structures.
    --
    -- @'foldr1' f = 'Prelude.foldr1' f . 'toList'@
    foldr1 :: (a -> a -> a) -> t a -> a
    foldr1 f xs = fromMaybe (error "foldr1: empty structure")
                    (foldr mf Nothing xs)
      where
        mf x Nothing = Just x
        mf x (Just y) = Just (f x y)

    -- | A variant of 'foldl' that has no base case,
    -- and thus may only be applied to non-empty structures.
    --
    -- @'foldl1' f = 'Prelude.foldl1' f . 'toList'@
    foldl1 :: (a -> a -> a) -> t a -> a
    foldl1 f xs = fromMaybe (error "foldl1: empty structure")
                    (foldl mf Nothing xs)
      where
        mf Nothing y = Just y
        mf (Just x) y = Just (f x y)

-- instances for Prelude types

instance Foldable Maybe where
    foldr _ z Nothing = z
    foldr f z (Just x) = f x z

    foldl _ z Nothing = z
    foldl f z (Just x) = f z x

instance Ix i => Foldable (Array i) where
    foldr f z = Prelude.foldr f z . elems
    foldl f z = Prelude.foldl f z . elems
    foldr1 f = Prelude.foldr1 f . elems
    foldl1 f = Prelude.foldl1 f . elems

-- | Monadic fold over the elements of a structure,
-- associating to the right, i.e. from right to left.
foldrM :: (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m b
foldrM f z0 xs = foldl f' return xs z0
  where f' k x z = f x z >>= k

-- | Monadic fold over the elements of a structure,
-- associating to the left, i.e. from left to right.
foldlM :: (Foldable t, Monad m) => (a -> b -> m a) -> a -> t b -> m a
foldlM f z0 xs = foldr f' return xs z0
  where f' x k z = f z x >>= k

-- | Map each element of a structure to an action, evaluate
-- these actions from left to right, and ignore the results.
traverse_ :: (Foldable t, Applicative f) => (a -> f b) -> t a -> f ()
traverse_ f = foldr ((*>) . f) (pure ())

-- | Map each element of a structure to a monadic action, evaluate
-- these actions from left to right, and ignore the results.
mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
mapM_ f = foldr ((>>) . f) (return ())

f ক্লোজুরে এটিকেও বলা হয় :

(def
    ^{:arglists '([f coll] [f val coll])
      :doc "f should be a function of 2 arguments. If val is not supplied,
  returns the result of applying f to the first 2 items in coll, then
  applying f to that result and the 3rd item, etc. If coll contains no
  items, f must accept no arguments as well, and reduce returns the
  result of calling f with no arguments.  If coll has only 1 item, it
  is returned and f is not called.  If val is supplied, returns the
  result of applying f to val and the first item in coll, then
  applying f to that result and the 2nd item, etc. If coll contains no
  items, returns val and f is not called."
      :added "1.0"}    
    reduce
     (fn r
       ([f coll]
             (let [s (seq coll)]
               (if s
                 (r f (first s) (next s))
                 (f))))
       ([f val coll]
          (let [s (seq coll)]
            (if s
              (if (chunked-seq? s)
                (recur f 
                       (.reduce (chunk-first s) f val)
                       (chunk-next s))
                (recur f (f val (first s)) (next s)))
              val)))))

6

আমি এই ধারণার সাথে একমত নই যেটির fফাংশন আর্গুমেন্টের একটি খারাপ নাম fold। প্রোগ্রামিংয়ে আমরা বর্ণনামূলক নামগুলি চাওয়ার কারণটি হ'ল আমরা জানি নামটি কী বর্ণনা করে এবং নামটি fসাধারণত একটি গণিতে (এবং কার্যকরী প্রোগ্রামিং ভাষাগুলি) কোনও ফাংশনের জন্য (যেমন gএবং হয় h) ব্যবহৃত হয়।

আমরা প্রায় কিছুই জানি না f(নকশার foldভিত্তিতে , যেহেতু আমরা এটি সম্পর্কে আরও সুনির্দিষ্ট হতে পারতাম, আমরা তত বেশি জিনিস ব্যবহার করতে পারিনি ), এবং নামটি fআমাদের জানার প্রয়োজনীয় সমস্ত কিছু জানিয়ে দেয়, এটি দুটি আর্গুমেন্টের কাজ ছাড়া। নামটি fঅনেকটা ইংরেজিতে 'এটি' সর্বনামের মতো - এটি একটি স্থানধারক যার অর্থ প্রায় কোনও কিছুই। আমরা এটি কোনও বাক্যে ব্যবহার না করা অবধি 'এটি' কী তা জানি না এবং fআমরা কল না করা পর্যন্ত কী তা আমরা জানি না fold

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

অত্যাবশ্যক প্রোগ্রামিংয়ে iলুপ কাউন্টার হিসাবে ব্যবহৃত হয় (যেমন রয়েছে jএবং kআমাদের আরও প্রয়োজন হলে); ফাংশনাল প্রোগ্রামিংয়ে fউচ্চতর অর্ডার ফাংশনগুলিতে ফাংশন আর্গুমেন্টের জন্য ব্যবহৃত হয় (যেমন আমাদের প্রয়োজন হলে gএবং হয় h)। আই / জে / কে কনভেনশন হিসাবে এফ / জি / এইচ কনভেনশনটি যেমন প্রতিষ্ঠিত হয়েছে তা নিশ্চিত করার জন্য আমার কার্যকরী ভাষা নিয়ে পর্যাপ্ত অভিজ্ঞতা নেই, তবে যদি তা না হয় তবে আমার মনে হয় এটি হওয়া উচিত (এটি অবশ্যই গণিতে প্রতিষ্ঠিত)।


3

এই জন্য সবচেয়ে সাধারণ নাম যা আমি অন্য চেয়ে সর্বনাম শুনেছি fহবে binary operationবা binary function- যে বেশী নির্দিষ্ট হচ্ছে সঙ্গে সমস্যা এটা আক্ষরিক না পারে কিছু , এবং যে কেন মানুষ টাইপ স্বাক্ষর বিদ্ধ a -> b -> a(অথবা a -> b -> bএটা ঠিক ভাঁজ হলে) ।

সুতরাং আমি প্রস্তাব দিচ্ছি যে আপনি ঠিক এটি করেন, প্রকারের স্বাক্ষরের সাথে লেগে থাকুন, ভাগ্যক্রমে সেই নির্দিষ্ট ধরণের স্বাক্ষরের একটি নাম থাকে: binary functionঠিক a -> aযেমন একটি unary operation, এবং a -> bএকটি unary function, আপনি a -> a -> aএকটি binary operationএবং a -> b -> cএকটি কল করতে পারেন binary function


1
আমার binary operationকাছে আরও অর্থ দাঁড়াতে হবে a -> a -> aএবং binary functionদাঁড়াবে a -> b -> c... সত্যই অবশ্যই এর মাঝে রয়েছে। :-)
ব্যবহারকারী 40989

@ ব্যবহারকারী 40989 ভাল কল, সংশোধন করা হয়েছে।
জিমি হোফা

1

আপনি যে ফাংশনটির জন্য জিজ্ঞাসা করছেন তা কখনও কখনও " সংহত ফাংশন" হিসাবে উল্লেখ করা হয় (উদাহরণস্বরূপ ফোল্ডে হাস্কেল উইকি পৃষ্ঠাটি দেখুন ) তবে এটি স্ট্যান্ডার্ড পরিভাষা বলার পক্ষে যথেষ্ট সাধারণ নয়।

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