কেউ কি সহজ শর্তে আমার কাছে ক্লজুর ট্রান্সডুসারকে ব্যাখ্যা করতে পারেন?


101

আমি এটি পড়তে চেষ্টা করেছি কিন্তু আমি এখনও তাদের মূল্য বা তারা প্রতিস্থাপন বুঝতে পারি না। এবং তারা কি আমার কোডকে আরও খাটো, আরও বোধগম্য বা কি করে?

হালনাগাদ

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

উত্তর:


75

ট্রান্সডুসাররা হ'ল অন্তর্নিহিত অনুক্রমটি কীভাবে (এটি কীভাবে করা যায়) অজানা ডেটা ক্রমের সাথে কী করবেন সেগুলি রেসিপিগুলি। এটি যে কোনও সেক, অ্যাসিঙ্ক চ্যানেল বা পর্যবেক্ষণযোগ্য হতে পারে।

এগুলি কম্পোজেবল এবং বহুকর্মী।

সুবিধাটি হ'ল, প্রতিবার নতুন ডেটা উত্স যুক্ত করার সময় আপনাকে সমস্ত মানক সংযোজক প্রয়োগ করতে হবে না। বারে বারে. ফলস্বরূপ প্রভাব হিসাবে আপনি ব্যবহারকারী হিসাবে বিভিন্ন ডেটা উত্সগুলিতে সেই রেসিপিগুলি পুনরায় ব্যবহার করতে সক্ষম হন।

বিজ্ঞাপন আপডেট

ক্লোজারের পূর্ববর্তী সংস্করণ 1.7 এর কাছে আপনার তিনটি উপায় ছিল কীভাবে ডেটাফ্লো ক্যোয়ারী লিখবেন:

  1. নেস্টেড কল
    (reduce + (filter odd? (map #(+ 2 %) (range 0 10))))
  1. ক্রিয়ামূলক রচনা
    (def xform
      (comp
        (partial filter odd?)
        (partial map #(+ 2 %))))
    (reduce + (xform (range 0 10)))
  1. থ্রেডিং ম্যাক্রো
    (defn xform [xs]
      (->> xs
           (map #(+ 2 %))
           (filter odd?)))
    (reduce + (xform (range 0 10)))

ট্রান্সডুসারগুলির সাহায্যে আপনি এটি লিখবেন:

(def xform
  (comp
    (map #(+ 2 %))
    (filter odd?)))
(transduce xform + (range 0 10))

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

(chan 1 xform)

4
আমি আরও উত্তর খুঁজছিলাম যা একটি উদাহরণ নিয়ে আসে যা আমাকে দেখায় যে ট্রান্সডুসাররা কীভাবে আমার সময় বাঁচায়।
appshare.co

আপনি ক্লোজার বা কিছু ডেটাফ্লো লিবিব রক্ষণাবেক্ষণকারী না হলে তারা তা করে না।
আলে রাউবেক

5
এটি কোনও প্রযুক্তিগত সিদ্ধান্ত নয়। আমরা কেবল ব্যবসায়িক মান ভিত্তিক সিদ্ধান্ত ব্যবহার করি। "কেবল তাদের ব্যবহার করুন" আমাকে বরখাস্ত করবে
apphare.co

4
ক্লোজুর ১.7 প্রকাশ না হওয়া পর্যন্ত ট্রান্সডুসার ব্যবহার করার চেষ্টা করতে দেরি করলে আপনার কাজটি রাখা আপনার পক্ষে আরও সহজ সময় হতে পারে।
ব্যবহারকারী 100464

7
ট্রান্সডুসারগুলি প্রত্যাবর্তনযোগ্য বস্তুর বিভিন্ন ধরণের উপর বিমূর্ত করার একটি কার্যকর উপায় বলে মনে হয়। এগুলি ক্লোজিউর সিকস বা গ্রাহ্যযোগ্য (যেমন অ্যাসিঙ্ক চ্যানেল) এর মতো ব্যবহারযোগ্য নয়। এই ক্ষেত্রে, আমার কাছে মনে হয় আপনি ট্রান্সডুসার ব্যবহার করে প্রচুর উপকৃত হবেন যদি, উদাহরণস্বরূপ, আপনি চ্যানেলগুলি ব্যবহার করে একটি সিক-ভিত্তিক বাস্তবায়ন থেকে একটি কোর.অনেক বাস্তবায়নে স্যুইচ করেন। ট্রান্সডুসারদের আপনার যুক্তির মূলটি অপরিবর্তিত রাখার অনুমতি দেওয়া উচিত। Traditionalতিহ্যবাহী সিকোয়েন্স-ভিত্তিক প্রক্রিয়াকরণ ব্যবহার করে ট্রান্সডুসার বা কিছু কোর-অ্যাসিঙ্ক এনালগ ব্যবহার করতে আপনাকে এটিকে রূপান্তর করতে হবে। এটি ব্যবসায়ের ক্ষেত্রে।
নাথান ডেভিস

47

ট্রান্সডুসারগুলি দক্ষতা উন্নত করে এবং আপনাকে আরও মডুলার পদ্ধতিতে দক্ষ কোড লেখার অনুমতি দেয়।

এটি একটি শালীন মাধ্যমে চালানো হয়

পুরাতন কল রচনা তুলনায় map, filter, reduceইত্যাদি আপনি ভাল পারফরম্যান্স পেতে কারণ আপনি ঐ সংগ্রহের প্রতিটি পদক্ষেপ মধ্যে অন্তর্বর্তী সংগ্রহের সংগ্রহ করতে, এবং বারবার হেঁটে যাওয়ার প্রয়োজন হবে না।

reducersআপনার সমস্ত ক্রিয়াকলাপকে একক অভিব্যক্তিতে তুলনা করার জন্য বা ম্যানুয়ালি রচনা করার জন্য, আপনি বিমূর্তি, আরও ভাল মড্যুলারালিটি এবং প্রক্রিয়াকরণ কার্যকারিতা পুনরায় ব্যবহার করতে সহজ হন।


4
শুধু কৌতূহলী, আপনি উপরে বলেছিলেন: "প্রতিটি পদক্ষেপের মধ্যে মধ্যবর্তী সংগ্রহ তৈরি করা"। কিন্তু "মধ্যবর্তী সংগ্রহগুলি" কী কোনও অ্যান্টি-প্যাটার্নের মতো শোনাচ্ছে না? .NET অলস গণনার প্রস্তাব দেয়, জাভা অলস প্রবাহ বা পেয়ারা চালিত পুনরাবৃত্তির প্রস্তাব দেয়, অলস হাস্কেলের অবশ্যই কিছুটা অলসতা থাকতে হবে। এগুলির কোনওটিরই মধ্যবর্তী সংগ্রহগুলি ব্যবহার করতে map/ প্রয়োজন হয় না কারণ এগুলি reduceপ্রত্যেকেই একটি পুনরুক্তি চেইন তৈরি করে। আমি এখানে ভুল কোথায়?
লাইবুমায়ার শায়দারিভ

4
বাসা বেধে থাকলে মধ্যবর্তী সংগ্রহ তৈরি করুন mapএবং filterতৈরি করুন।
গোলমাল

4
এবং কমপক্ষে ক্লজুরের আলস্যতার সংস্করণ সম্পর্কে, অলসতার বিষয়টি এখানে অরথগোনাল। হ্যাঁ, মানচিত্র এবং ফিল্টারটি অলস, আপনি যখন শৃঙ্খলিত করেন তখন অলস মানের জন্য পাত্রেও উত্পন্ন করে। যদি আপনি মাথার উপরে না ধরে থাকেন তবে আপনি বড় অলস অনুক্রমগুলি তৈরি করেন না যা প্রয়োজন হয় না তবে আপনি প্রতিটি অলস উপাদানটির জন্য এখনও মধ্যবর্তী বিমূর্ততাগুলি তৈরি করেন।
নয়েজমিথ

একটি উদাহরণ Woud সুন্দর হতে।
appshare.co

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

22

ট্রান্সডুসারগুলি ফাংশন হ্রাস করার জন্য সংমিশ্রণের একটি মাধ্যম।

উদাহরণ: ফাংশন হ্রাস হ'ল ফাংশন যা দুটি আর্গুমেন্ট গ্রহণ করে: এ পর্যন্ত একটি ফলাফল এবং একটি ইনপুট। তারা একটি নতুন ফলাফল ফিরে (এখনও অবধি)। উদাহরণস্বরূপ +: দুটি আর্গুমেন্টের সাহায্যে আপনি প্রথমটিকে এখন পর্যন্ত ফলাফল হিসাবে এবং দ্বিতীয়টি ইনপুট হিসাবে ভাবতে পারেন।

ট্রান্সডুসার এখন + ফাংশন নিতে এবং এটিকে দ্বিগুণ-প্লাস ফাংশন করতে পারে (এটি যুক্ত করার আগে প্রতিটি ইনপুট দ্বিগুণ করে)। এই ট্রান্সডুসারটি দেখতে কেমন হবে (বেশিরভাগ মূল শর্তে):

(defn double
  [rfn]
  (fn [r i] 
    (rfn r (* 2 i))))

চিত্রণ বিকল্প জন্য rfnসঙ্গে +দেখতে কিভাবে +রূপান্তরিত হয় দুইবার-প্লাস:

(def twice-plus ;; result of (double +)
  (fn [r i] 
    (+ r (* 2 i))))

(twice-plus 1 2)  ;-> 5
(= (twice-plus 1 2) ((double +) 1 2)) ;-> true

তাই

(reduce (double +) 0 [1 2 3]) 

এখন 12 ফলন হবে।

ট্রান্সডুসারদের দ্বারা ফিরিয়ে দেওয়া ফাংশন হ্রাস করার ফলে ফলাফল কীভাবে সঞ্চিত হয় তার থেকে পৃথক হয় কারণ তারা অজান্তেই কীভাবে তাদের কাছে হ্রাস করা ফাংশনটি জমা করে। এখানে আমরা conjপরিবর্তে ব্যবহার +Conjসংগ্রহ এবং একটি মান নেয় এবং সেই মান সংযোজন সহ একটি নতুন সংগ্রহ প্রদান করে।

(reduce (double conj) [] [1 2 3]) 

ফলন হবে [2 4 6]

ইনপুট কী ধরণের সোর্স থেকে তারা স্বতন্ত্র।

হ্রাসকারী ক্রিয়াকলাপগুলি রূপান্তর করতে একাধিক ট্রান্সডুসারকে (চেইনটেবল) রেসিপি হিসাবে শৃঙ্খলাবদ্ধ করা যেতে পারে।

আপডেট: যেহেতু এখন এটি সম্পর্কে একটি অফিশিয়াল পৃষ্ঠা রয়েছে, তাই আমি এটি পড়ার জন্য অত্যন্ত পরামর্শ দিচ্ছি: http://clojure.org/transducers


চমৎকার ব্যাখ্যা কিন্তু শীঘ্রই আমার জন্য খুব বেশি জাঁকজমকপূর্ণ হয়ে উঠল, "ট্রান্সডুসারদের দ্বারা উত্পাদিত ফাংশন হ্রাস করার ফলে ফলাফল কীভাবে সঞ্চিত হয় তার থেকে আলাদা"।
appshare.co

4
আপনি ঠিক বলেছেন, উত্পন্ন শব্দটি এখানে অনুপযুক্ত ছিল।
লিওন গ্রেপেনথিন

ঠিক আছে. যাইহোক আমি বুঝতে পারি যে ট্রান্সফর্মারগুলি এখন কেবল একটি অপ্টিমাইজেশন, তাই সম্ভবত আর কোনওভাবেই ব্যবহার করা উচিত নয়
appshare.co

4
এগুলি ফাংশন হ্রাস করার জন্য সংমিশ্রণের একটি মাধ্যম। তোমার আর কোথায় আছে? এটি একটি অপ্টিমাইজেশনের চেয়ে অনেক বেশি।
লিওন গ্র্যাপেনথিন

আমি এই উত্তরটি খুব আকর্ষণীয় মনে করি, তবে এটি কীভাবে ট্রান্সডুসারদের সাথে সংযুক্ত হয় তা আমার কাছে স্পষ্ট নয় (আংশিক কারণ এখনও আমি বিষয়টিকে বিভ্রান্তিকর বলে মনে করি)। মধ্যে সম্পর্ক কি doubleএবং transduce?
মঙ্গল

22

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

cat /etc/passwd | tr '[:lower:]' '[:upper:]' | cut -d: -f1| grep R| wc -l

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

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

সুতরাং আপনার প্রশ্নের উত্তর দেওয়ার জন্য, ট্রান্সডুসারগুলি আপনার কোডটি ছোট বা আরও বেশি বোধগম্য করবে না তবে আপনার কোডটি সম্ভবত দীর্ঘতর বা কম বোধগম্য হবে না এবং আপনি যদি প্রচুর ডেটা নিয়ে কাজ করছেন, ট্রান্সডুসারগুলি আপনার কোডটি তৈরি করতে পারে দ্রুত

এটি ট্রান্সডুসারগুলির একটি খুব ভাল ওভারভিউ।


4
আহ, সুতরাং ট্রান্সডুসারগুলি বেশিরভাগই পারফরম্যান্স অপটিমাইজেশন হয়, আপনি কি বলছেন?
appshare.co

@ জুবায়ের হ্যাঁ, এটা ঠিক। নোট করুন যে অপ্টিমাইজেশন মধ্যবর্তী স্ট্রিমগুলি অপসারণের বাইরে চলে গেছে; আপনি সমান্তরালে অপারেশন করতে সক্ষম হতে পারে।
ব্যবহারকারী 100464

4
এটি উল্লেখ করার মতো pmap, যা যথেষ্ট মনোযোগ পাচ্ছে বলে মনে হয় না। আপনি যদি mapসিকোয়েন্সের উপরে কোনও ব্যয়বহুল ফাংশনটি পিং করছেন তবে অপারেশনটিকে সমান্তরাল করা "পি" যুক্ত করার মতোই সহজ। আপনার কোডে অন্য কোনও কিছু পরিবর্তন করার দরকার নেই এবং এটি এখন উপলভ্য - আলফা নয়, বিটা নয়। (যদি ফাংশনটি মধ্যবর্তী ক্রমগুলি তৈরি করে, তবে ট্রান্সডুসারগুলি আরও দ্রুত হতে পারে, আমি অনুমান করব))
মঙ্গলবার

10

রিচ হিকি স্ট্রঞ্জ লুপ ২০১৪ সম্মেলনে (৪৫ মিনিট) একটি 'ট্রান্সডুসার্স' বক্তৃতা দিয়েছিলেন।

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

ভিডিও: https://www.youtube.com/watch?v=6mTbuzafcII


8

আমি ট্রান্সডুসার-জেএসের উদাহরণগুলি পড়তে পেরেছি, কীভাবে আমি তাদের প্রতিদিনের কোডে ব্যবহার করতে পারি তার সবিস্তারে তাদের বুঝতে সহায়তা করে।

উদাহরণস্বরূপ, এই উদাহরণটি বিবেচনা করুন (উপরের লিঙ্কে README থেকে নেওয়া):

var t = require("transducers-js");

var map    = t.map,
    filter = t.filter,
    comp   = t.comp,
    into   = t.into;

var inc    = function(n) { return n + 1; };
var isEven = function(n) { return n % 2 == 0; };
var xf     = comp(map(inc), filter(isEven));

console.log(into([], xf, [0,1,2,3,4])); // [2,4]

এক জন্য, ব্যবহারকারীর xfসাথে অ্যান্ডস্কোরের সাথে স্বাভাবিক বিকল্পের চেয়ে অনেক বেশি পরিচ্ছন্ন দেখাচ্ছে।

_.filter(_.map([0, 1, 2, 3, 4], inc), isEven);

ট্রান্সডুসারগুলির উদাহরণটি এত দীর্ঘ। আন্ডারস্কোর সংস্করণটি আরও সংক্ষিপ্ত দেখাচ্ছে
appshare.co

4
@ জুবায়ের সত্যই নয়t.into([], t.comp(t.map(inc), t.filter(isEven)), [0,1,2,3,4])
হুয়ান

7

ট্রান্সডুসারগুলি (আমার বোঝার জন্য!) ফাংশন যা একটি হ্রাসকরণ ফাংশন নেয় এবং অন্যটি ফেরত দেয়। একটি হ্রাস ফাংশন একটি যা

উদাহরণ স্বরূপ:

user> (def my-transducer (comp count filter))
#'user/my-transducer
user> (my-transducer even? [0 1 2 3 4 5 6])
4
user> (my-transducer #(< 3 %) [0 1 2 3 4 5 6])
3

এই ক্ষেত্রে আমার-ট্রান্সডুসার একটি ইনপুট ফিল্টারিং ফাংশন নেয় যা এটি 0 এর সাথে প্রযোজ্য তবে যদি সেই মানটি কি সমান হয়? প্রথম ক্ষেত্রে ফিল্টারটি সেই মানটিকে কাউন্টারে পাস করে, তারপরে এটি পরবর্তী মানটি ফিল্টার করে। পরিবর্তে প্রথমে ফিল্টারিং এবং তারপরে সেই সমস্ত মান গণনা করতে ছাড়িয়ে।

এটি দ্বিতীয় উদাহরণে একই জিনিস এটি একবারে একটি মান পরীক্ষা করে এবং যদি সেই মানটি 3 এর চেয়ে কম হয় তবে এটি গণনা 1 যুক্ত করতে দেয়।


আমি এই সহজ ব্যাখ্যাটি পছন্দ করেছি
Ignacio

7

একটি ট্রান্সডুসার পরিষ্কার সংজ্ঞা এখানে:

Transducers are a powerful and composable way to build algorithmic transformations that you can reuse in many contexts, and they’re coming to Clojure core and core.async.

এটি বুঝতে, আসুন নিম্নলিখিত সহজ উদাহরণটি বিবেচনা করুন:

;; The Families in the Village

(def village
  [{:home :north :family "smith" :name "sue" :age 37 :sex :f :role :parent}
   {:home :north :family "smith" :name "stan" :age 35 :sex :m :role :parent}
   {:home :north :family "smith" :name "simon" :age 7 :sex :m :role :child}
   {:home :north :family "smith" :name "sadie" :age 5 :sex :f :role :child}

   {:home :south :family "jones" :name "jill" :age 45 :sex :f :role :parent}
   {:home :south :family "jones" :name "jeff" :age 45 :sex :m :role :parent}
   {:home :south :family "jones" :name "jackie" :age 19 :sex :f :role :child}
   {:home :south :family "jones" :name "jason" :age 16 :sex :f :role :child}
   {:home :south :family "jones" :name "june" :age 14 :sex :f :role :child}

   {:home :west :family "brown" :name "billie" :age 55 :sex :f :role :parent}
   {:home :west :family "brown" :name "brian" :age 23 :sex :m :role :child}
   {:home :west :family "brown" :name "bettie" :age 29 :sex :f :role :child}

   {:home :east :family "williams" :name "walter" :age 23 :sex :m :role :parent}
   {:home :east :family "williams" :name "wanda" :age 3 :sex :f :role :child}])

আমরা কী জানতে পারি যে গ্রামে কত শিশু রয়েছে? আমরা নীচের রিডুসার দিয়ে এটি সহজেই খুঁজে পেতে পারি:

;; Example 1a - using a reducer to add up all the mapped values

(def ex1a-map-children-to-value-1 (r/map #(if (= :child (:role %)) 1 0)))

(r/reduce + 0 (ex1a-map-children-to-value-1 village))
;;=>
8

এটি করার আরেকটি উপায় এখানে:

;; Example 1b - using a transducer to add up all the mapped values

;; create the transducers using the new arity for map that
;; takes just the function, no collection

(def ex1b-map-children-to-value-1 (map #(if (= :child (:role %)) 1 0)))

;; now use transduce (c.f r/reduce) with the transducer to get the answer 
(transduce ex1b-map-children-to-value-1 + 0 village)
;;=>
8

এছাড়াও, অ্যাকাউন্টগুলিতে সাবগ্রুপগুলি গ্রহণ করার সময় এটি সত্যই শক্তিশালী। উদাহরণস্বরূপ, আমরা যদি জানতে পারি যে ব্রাউন পরিবারে কতগুলি শিশু রয়েছে, আমরা মৃত্যুদণ্ড কার্যকর করতে পারি:

;; Example 2a - using a reducer to count the children in the Brown family

;; create the reducer to select members of the Brown family
(def ex2a-select-brown-family (r/filter #(= "brown" (string/lower-case (:family %)))))

;; compose a composite function to select the Brown family and map children to 1
(def ex2a-count-brown-family-children (comp ex1a-map-children-to-value-1 ex2a-select-brown-family))

;; reduce to add up all the Brown children
(r/reduce + 0 (ex2a-count-brown-family-children village))
;;=>
2

আমি আশা করি আপনি এই উদাহরণগুলি সহায়ক পেতে পারেন। আপনি এখানে আরও জানতে পারেন

আশা করি এটা সাহায্য করবে.

ক্লেমেনসিও মোরালেস লুকাস।


4
"ট্রান্সডুসারগুলি অ্যালগরিদমিক ট্রান্সফর্মেশনগুলি তৈরির একটি শক্তিশালী এবং কম্পোজেবল উপায় যা আপনি অনেকগুলি প্রসঙ্গে পুনরায় ব্যবহার করতে পারেন, এবং তারা ক্লোজুরে কোর এবং কোর.অ্যাসেন্সিতে আসছেন" " সংজ্ঞা প্রায় কোনও কিছুর জন্য প্রযোজ্য?
appshare.co

4
প্রায় কোনও ক্লোজার ট্রান্সডুসারকে আমি বলতে চাই।
ক্লেমেনসিও মোরালেস লুকাস

6
এটি একটি সংজ্ঞা চেয়ে মিশনের বিবৃতি বেশি।
মঙ্গল

4

আমি এটি সম্পর্কে ক্লোজারস্ক্রিপ্ট উদাহরণ দিয়ে ব্লগ করেছি যা বর্ণনা করে যে সিকোয়েন্স ফাংশনগুলি হ্রাসকরণ ফাংশনটি প্রতিস্থাপন করতে সক্ষম হয়ে এখন কীভাবে সম্প্রসারণযোগ্য ।

এটি পড়ার সাথে সাথে ট্রান্সডুসারদের বিষয়টি এটি। আপনার সম্পর্কে যদি মনে করেন consবা conjঅপারেশন যে কঠিন মত অপারেশনে কোডেড হয় map, filterইত্যাদি, হ্রাস ফাংশন অনধিগম্য ছিল।

ট্রান্সডুসারগুলির সাহায্যে হ্রাসকরণ ক্রিয়াকলাপটি ডিউপলড হয় এবং আমি pushট্রান্সডুসারদের জন্য স্থানীয় জাভাস্ক্রিপ্ট অ্যারে ধন্যবাদ দিয়ে এটির মতো প্রতিস্থাপন করতে পারি ।

(transduce (filter #(not (.hasOwnProperty prevChildMapping %))) (.-push #js[]) #js [] nextKeys)

filter এবং বন্ধুদের একটি নতুন 1 আরটি অপারেশন রয়েছে যা একটি ট্রান্সমিশিং ফাংশন ফিরিয়ে দেবে যা আপনি নিজের কমানোর ফাংশন সরবরাহ করতে ব্যবহার করতে পারেন।


4

এখানে আমার (বেশিরভাগ) জার্গন এবং কোড ফ্রি উত্তর।

দুটি উপায়ে ডেটা চিন্তা করুন, একটি স্ট্রিম (সময়ের সাথে সাথে ঘটে যাওয়া মানগুলি যেমন ইভেন্টগুলি) বা একটি কাঠামো (এমন ডেটা যা সময়ের সাথে সাথে একটি তালিকা যেমন একটি তালিকা, ভেক্টর, একটি অ্যারে ইত্যাদি)।

কিছু নির্দিষ্ট অপারেশন রয়েছে যা আপনি স্ট্রিম বা কাঠামোর উপর দিয়ে সম্পাদন করতে চাইতে পারেন। এরকম একটি অপারেশন হ'ল ম্যাপিং। একটি ম্যাপিং ফাংশন প্রতিটি ডেটা আইটেমকে (এটি একটি সংখ্যা বলে ধরে নেওয়া) 1 দ্বারা বাড়িয়ে তুলতে পারে এবং আপনি আশা করতে পারেন যে এটি কোনও স্ট্রিম বা কাঠামোর ক্ষেত্রে কীভাবে প্রযোজ্য হতে পারে।

একটি ম্যাপিং ফাংশন হ'ল ফাংশনগুলির মধ্যে একটি যা কখনও কখনও "ফাংশন হ্রাস" হিসাবে পরিচিত। আর একটি সাধারণ হ্রাসকরণ ফাংশন হ'ল ফিল্টার যা প্রাকটিকের সাথে মেলে এমন মানগুলি সরিয়ে দেয় (যেমন সমান মানগুলি মুছে ফেলবে)।

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

সুতরাং এই সম্পর্কে বিশেষ কি? সাধারণত, ফাংশনগুলি হ্রাস করা স্ট্রিম এবং স্ট্রাকচার উভয়কেই কার্যকরভাবে তৈরি করতে সক্ষম হয় না।

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


2

আমি যতদূর বুঝতে পারি, এগুলি ইনপুট এবং আউটপুট বাস্তবায়ন থেকে বিলম্বিত ব্লকগুলির মতো । আপনি শুধু অপারেশন সংজ্ঞায়িত করুন।

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

আমি ট্রান্সডুসারদের কাছেও নতুন, সম্ভবত-অস্পষ্ট উত্তরের জন্য দুঃখিত।


1

আমি দেখতে পাচ্ছি যে এই পোস্টটি আপনাকে ট্রান্সডুসারের আরও বার্ড আই ভিউ দেয়।

https://medium.com/@roman01la/unders સમજ-transducers-in-javascript-3500d3bd9624


4
কেবলমাত্র বাহ্যিক লিঙ্কগুলির উপর নির্ভর করে উত্তরগুলি এসও-তে নিরুৎসাহিত করা হয় কারণ ভবিষ্যতে লিঙ্কগুলি যে কোনও সময়ে ভেঙে যেতে পারে। পরিবর্তে আপনার উত্তরের সামগ্রীটি উদ্ধৃত করুন।
ভিনসেন্ট ক্যান্টিন

@ ভিনসেন্ট ক্যান্টিন আসলে, মিডিয়াম পোস্টটি মুছে ফেলা হয়েছে।
দিমিত্রি জইতসেভ

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