ফাংশনাল প্রোগ্রামিংয়ে, ফান্টেক্টর কী?


224

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

কেউ কি দয়া করে এই শব্দটি সংজ্ঞায়িত করতে পারেন, এর ব্যবহারটি ব্যাখ্যা করতে পারেন, এবং সম্ভবত ফান্টেক্টরগুলি কীভাবে তৈরি এবং ব্যবহার করা হয় তার একটি উদাহরণ সরবরাহ করতে পারেন?

সম্পাদনা : যদিও আমি এই শব্দটির পিছনে তত্ত্বটির প্রতি আগ্রহী, তবুও আমি ধারণার বাস্তবায়ন এবং ব্যবহারিক ব্যবহারের চেয়ে তত্ত্বের প্রতি কম আগ্রহী।

সম্পাদনা 2 : দেখে মনে হচ্ছে কিছু ক্রস টার্মিনোলিজি চলছে: আমি বিশেষত ফাংশনাল প্রোগ্রামিংয়ের ফান্টাক্টরগুলি উল্লেখ করছি, সি ++ এর ক্রিয়াকলাপ নয়।


4
আরও দেখুন: adit.io/posts/...
Vlad Impala

খুব প্রশংসনীয় ভাল উত্তর: stackoverflow.com/a/45149475/1498178
toraritte

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

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

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

উত্তর:


273

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

  • ভাষার এমএল পরিবারে, একটি ফান্ট্যাক্টর এমন একটি মডিউল যা প্যারামিটার হিসাবে এক বা একাধিক মডিউল নেয়। এটি একটি উন্নত বৈশিষ্ট্য হিসাবে বিবেচিত হয় এবং বেশিরভাগ প্রারম্ভিক প্রোগ্রামারদের এটির সাথে অসুবিধা হয়।

    বাস্তবায়ন এবং ব্যবহারিক ব্যবহারের উদাহরণ হিসাবে, আপনি একবারে এবং সকলের জন্য ফান্টর হিসাবে আপনার সুষম বাইনারি অনুসন্ধান গাছের পছন্দসই রূপটি সংজ্ঞায়িত করতে পারেন এবং এটি একটি পরামিতি হিসাবে মডিউল সরবরাহ করে যা:

    • বাইনারি গাছে কী কী প্রকারের ব্যবহার করা হবে

    • কীগুলিতে মোট অর্ডার ক্রিয়াকলাপ

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

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

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

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

    • টাইপটি Tঅন্য ধরণের উপরে প্যারামিটারাইজড, যা আপনি সংগ্রহের উপাদান টাইপ হিসাবে ভাবেন। সম্পূর্ণ সংগ্রহ ধরণ তারপর ভালো কিছু হয় T Int, T String, T Bool, আপনি যদি পূর্ণসংখ্যার স্ট্রিং, বা Booleans যথাক্রমে ধারণকারী করছে। যদি উপাদান ধরনের অজানা থাকে তবে এটি টাইপ পরামিতি হিসাবে লেখা aহয় T a

      উদাহরণ তালিকা (শূন্য বা টাইপ আরো উপাদানগুলি a), Maybeটাইপ (শূন্য বা টাইপ এক উপাদান a), ধরনের উপাদানের সেট a, টাইপ উপাদানের অ্যারে a, টাইপ মান ধারণকারী অনুসন্ধান গাছ সব ধরণের a, এবং অন্যদের প্রচুর আপনি চিন্তা করতে পারেন।

    • অন্য যে সম্পত্তিটি Tসন্তুষ্ট করতে হবে তা হ'ল যদি আপনার ধরণের a -> bকোনও ফাংশন থাকে (উপাদানগুলির উপর একটি ফাংশন), তবে আপনাকে সেই ফাংশনটি সংগ্রহ করতে এবং সংগ্রহগুলিতে সম্পর্কিত ফাংশনটি নিতে সক্ষম হতে হবে। আপনি অপারেটরের সাথে এটি করুন fmap, যা Functorটাইপ শ্রেণীর প্রতিটি ধরণের দ্বারা ভাগ করা হয় । অপারেটরটি আসলে ওভারলোডেড, সুতরাং আপনার যদি টাইপযুক্ত কোনও ফাংশন evenথাকে Int -> Boolতবে

      fmap even

      একটি ওভারলোডেড ফাংশন যা অনেক বিস্ময়কর কাজ করতে পারে:

      • পূর্ণসংখ্যার একটি তালিকা বুলিয়ানদের তালিকায় রূপান্তর করুন

      • পূর্ণসংখ্যার গাছকে বুলিয়ান্সের গাছে রূপান্তর করুন

      • রূপান্তর Nothingকরার Nothingএবং Just 7করতেJust False

      হাসকেলে, এই সম্পত্তিটি এই ধরণের প্রদান করে প্রকাশ করা হয় fmap:

      fmap :: (Functor t) => (a -> b) -> t a -> t b

      যেখানে এখন আমাদের একটি ছোট রয়েছে t, যার অর্থ " Functorশ্রেণীর কোনও ধরণের "।

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

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


7
আমি এমএল-ফান্টেক্টর এবং হাস্কেল-ফান্টেক্টর উভয়ই বুঝতে পারি, তবে সেগুলি একসাথে সম্পর্কিত করার অন্তর্দৃষ্টিটির অভাব রয়েছে। বিভাগ-তাত্ত্বিক দিক থেকে এই দুজনের মধ্যে কী সম্পর্ক?
ওয়েই হু

6
@ ওয়েই হু: বিভাগের তত্ত্বটি আমার কাছে কখনই কোনও ধারণা দেয়নি। সবচেয়ে ভাল আমি বলতে পারি যে তিনটি ধারণা ম্যাপিং জড়িত।
নরম্যান রামসে

16
এই হাস্কেল উইকির মতে: এন.ইউইকিবুকস.আর / উইকি / হ্যাস্কেল / ক্যাটাগরি_থ্যোরি , এটি এর মতো: একটি বিভাগ হ'ল বস্তু এবং মোর্ফিজম (ফাংশন) এর সংকলন, যেখানে মরফিজমগুলি কোনও বিভাগের বস্তু থেকে অন্য বিভাগে অন্য বিভাগে আসে where । ফান্টেক্টর এমন একটি ফাংশন যা একটি বিভাগ থেকে অন্য বিভাগে অবজেক্টস এবং মরফিজমগুলিতে অবজেক্টস এবং মরফিজমসকে ম্যাপ করে। অন্তত আমি এটি বুঝতে পারি যে। প্রোগ্রামিংয়ের হুবহু অর্থ কী তা আমি এখনও বুঝতে পারি নি।
পল

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

2
then you have to be able to take that function and product a related function on collectionsআপনি কি এর produceপরিবর্তে বোঝাতে চেয়েছিলেন product?
সমস্যাসংক্রান্ত

64

এখানে অন্যান্য উত্তরগুলি সম্পূর্ণ, তবে আমি ফান্টারের এফপি ব্যবহারের আরও একটি ব্যাখ্যা চেষ্টা করব । এটিকে উপমা হিসাবে গ্রহণ করুন:

একজন functor ধরনের একটি ধারক একটি যে, যখন একটি ফাংশন যে থেকে মানচিত্রগুলি বিষয় একটি , টাইপ একটি ধারক উৎপাদ

সি ++ এ বিমূর্ত-ফাংশন-পয়েন্টার ব্যবহারের বিপরীতে, এখানে ফান্টারের কাজটি নয় ; বরং এটি এমন কিছু যা কোনও ক্রিয়াকলাপের শিকার হওয়ার সময় ধারাবাহিকভাবে আচরণ করে


3
বি টাইপের একটি ধারকটির অর্থ "ইনপুট ধারক হিসাবে একই ধরণের ধারক, তবে এখন বি এর সাথে ভরাট"। সুতরাং যদি আমাদের কাছে কলাগুলির একটি তালিকা থাকে এবং আমরা একটি ফাংশন ম্যাপ করি যা কলা নেয় এবং একটি ফল সালাদ আউটপুট দেয়, আমাদের কাছে এখন ফলের সালাদগুলির একটি তালিকা রয়েছে। তেমনিভাবে, যদি আমাদের কাছে কলা গাছ থাকে এবং আমরা একই ফাংশনটির মানচিত্র রাখি তবে আমাদের কাছে এখন আপেল গাছ হবে tree ইত্যাদি গাছ এবং তালিকা এখানে দুটি ফ্যাক্টর।
কিউকিউই

3
"একটি ফান্টর টাইপের ধরণের একটি ধারক, যখন কোনও ক্রিয়াকলাপের মুখোমুখি হয়" - এটি প্রকৃতপক্ষে অন্যভাবে - ফাংশনটি (মরফিজম) কোনও ফান্টারের সাপেক্ষে, অন্য আকারে ম্যাপ করা যায়
দিমিত্রি জয়েটসেভ

38

তিনটি ভিন্ন অর্থ রয়েছে, খুব বেশি সম্পর্কিত নয়!

  • ওক্যামেলে এটি একটি প্যারাম্যাট্রাইজড মডিউল। ম্যানুয়াল দেখুন । আমি মনে করি এগুলি ছাঁটাই করার সর্বোত্তম উপায়টি উদাহরণস্বরূপ: (দ্রুত লিখিত, বগি হতে পারে)

    module type Order = sig
        type t
        val compare: t -> t -> bool
    end;;
    
    
    module Integers = struct
        type t = int
        let compare x y = x > y
    end;;
    
    module ReverseOrder = functor (X: Order) -> struct
        type t = X.t
        let compare x y = X.compare y x
    end;;
    
    (* We can order reversely *)
    module K = ReverseOrder (Integers);;
    Integers.compare 3 4;;   (* this is false *)
    K.compare 3 4;;          (* this is true *)
    
    module LexicographicOrder = functor (X: Order) -> 
      functor (Y: Order) -> struct
        type t = X.t * Y.t
        let compare (a,b) (c,d) = if X.compare a c then true
                             else if X.compare c a then false
                             else Y.compare b d
    end;;
    
    (* compare lexicographically *)
    module X = LexicographicOrder (Integers) (Integers);;
    X.compare (2,3) (4,5);;
    
    module LinearSearch = functor (X: Order) -> struct
        type t = X.t array
        let find x k = 0 (* some boring code *)
    end;;
    
    module BinarySearch = functor (X: Order) -> struct
        type t = X.t array
        let find x k = 0 (* some boring code *)
    end;;
    
    (* linear search over arrays of integers *)
    module LS = LinearSearch (Integers);;
    LS.find [|1;2;3] 2;;
    (* binary search over arrays of pairs of integers, 
       sorted lexicographically *)
    module BS = BinarySearch (LexicographicOrder (Integers) (Integers));;
    BS.find [|(2,3);(4,5)|] (2,3);;

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

  • হাস্কেলের মতো ক্রিয়ামূলক প্রোগ্রামিং ভাষায় এর অর্থ কিছু ধরণের নির্মাণকারী (প্যারাম্যাট্রাইজড ধরণের তালিকাগুলি, সেট) যা "ম্যাপ করা যায়"। সুনির্দিষ্টভাবে বলতে গেলে, একটি ফান্টেক্টর fসজ্জিত (a -> b) -> (f a -> f b)। বিভাগের তত্ত্বে এর উত্স রয়েছে। আপনি উইকিপিডিয়া নিবন্ধটি ব্যবহার করেছেন এটি হ'ল ব্যবহার।

    class Functor f where
        fmap :: (a -> b) -> (f a -> f b)
    
    instance Functor [] where      -- lists are a functor
        fmap = map
    
    instance Functor Maybe where   -- Maybe is option in Haskell
        fmap f (Just x) = Just (f x)
        fmap f Nothing = Nothing
    
    fmap (+1) [2,3,4]   -- this is [3,4,5]
    fmap (+1) (Just 5)  -- this is Just 6
    fmap (+1) Nothing   -- this is Nothing

সুতরাং, এটি একটি বিশেষ ধরণের নির্মাণকারী, এবং ওকামলে ফ্যান্ট্যাক্টরগুলির সাথে খুব কম সম্পর্ক রয়েছে!

  • অপরিহার্য ভাষায়, এটি কাজ করার জন্য একটি পয়েন্টার।

এই মন্তব্যটির শেষ 3 লাইনে <Q> মানচিত্র </قিক> থাকা উচিত নয় <<> fmap </q>?
ইম্জ - ইভান জাকারিয়াশ্চ শেভ

1
আমি সবসময় পড়েছি যে ফান্টেক্টরগুলি পাত্রে থাকে - তবে এটি কেবল একটি সরল সরলকরণ। আপনার উত্তরটি অবশেষে অনুপস্থিত লিঙ্কটি সরবরাহ করেছে: ফ্যান্ট্যাক্টরগুলি প্যারামিটারাইজড ধরণের (টাইপ কনস্ট্রাক্টর) জন্য টাইপ শ্রেণি (টাইপ সীমাবদ্ধতা)। এটা যে সহজ!

16

ওক্যামেলে এটি একটি প্যারামিটারাইজড মডিউল।

আপনি যদি সি ++ জানেন তবে ওপ্যামাল ফ্যান্টেক্টরটিকে একটি টেম্পলেট হিসাবে ভাবেন। সি ++ এর কেবল ক্লাস টেম্পলেট রয়েছে এবং ফান্ট্যাক্টরগুলি মডিউল স্কেলে কাজ করে।

ফান্টারের উদাহরণ ম্যাপ.মেক; module StringMap = Map.Make (String);;স্ট্রিং-কিড মানচিত্রের সাথে কাজ করে এমন একটি মানচিত্র মডিউল তৈরি করে।

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


আমি এটি অকামাল ওয়েবসাইট থেকে পেয়েছি - তবে প্যারামিটারাইজড মডিউলটির ব্যবহার কী হবে তা আমি বুঝতে পারি না।
এরিক ফোর্বস

4
@ কর্নেল হ্যাঁ, আমি যা বর্ণনা করেছি এটি একটি ওক্যামল ধারণা। অন্য ধারণাটি কেবলমাত্র "কার্যকরী মান", যা এফপিতে বিশেষ কিছু নয়। @ এরিক আমি সামান্য প্রসারিত করেছি, তবে রেফারেন্স ডক্স লোড হতে ধীর।
টুবু

13

আপনি বেশ কয়েকটি ভাল উত্তর পেয়েছি। আমি পিচ করব:

গাণিতিক দিক থেকে একজন ফান্টেক্টর একটি বীজগণিতের বিশেষ ধরণের কাজ। এটি একটি ন্যূনতম ফাংশন যা বীজগণিতকে অন্য বীজগণিতের মানচিত্র করে। "সংক্ষিপ্ততা" ফান্টারের আইন দ্বারা প্রকাশ করা হয়।

এটি দেখার দুটি উপায় আছে। উদাহরণস্বরূপ, তালিকাগুলি কিছু ধরণের ফান্টেক্টর। এটি, 'a' টাইপের উপরে একটি বীজগণিত দেওয়া হয়, আপনি 'a' টাইপের জিনিসযুক্ত তালিকার একটি সামঞ্জস্য বীজগণিত তৈরি করতে পারেন। (উদাহরণস্বরূপ: মানচিত্র যা একটি উপাদানটিকে একটি সিঙ্গলটন তালিকায় নিয়ে যায়: f (a) = [a]) আবার, সামঞ্জস্যের ধারণাটি ফান্টারের আইন দ্বারা প্রকাশ করা হয়।

অন্যদিকে, একটি ফান্টকারকে একটি "টাইপ এ" ওভার "দেওয়া" (যা এফএ ফান্টর এফ টাইপ এ এর ​​বীজগণিতায় প্রয়োগ করার ফলস্বরূপ), এবং g: a -> b থেকে ফাংশন করে আমরা গণনা করতে পারি একটি নতুন ফান্টেক্টর এফ = (এফএমএপ জি) যা এফ থেকে এফ বি তে মানচিত্র করে। সংক্ষেপে, fmap হ'ল F এর অংশ যা "ফান্টেক্টর পার্টস" থেকে "ফান্টেক্টর পার্টস" ম্যাপ করে এবং g সেই ফাংশনের অংশ যা "বীজগণিত অংশগুলি" থেকে "বীজগণিত অংশগুলি" মানচিত্র করে। এটি একটি ফাংশন নেয়, একটি ফান্টেক্টর এবং একবার সম্পূর্ণ হয়ে গেলে এটি খুব ফান্টেক্টর।

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

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

ডেটা এফ = এফ ইন্ট

Ints এর শ্রেণিতে isomorphic হয়। সুতরাং, মান নির্মাতা হিসাবে, এফ একটি ফাংশন যা আন্তঃ এফ ইনটকে মানচিত্রের সমতুল্য বীজগণিত করে। এটি একটি ফান্টেক্টর। অন্যদিকে, আপনি এখানে বিনামূল্যে এফএম্যাপ পাবেন না। প্যাটার্ন ম্যাচিং এর জন্য এটি।

বীজগণিতের সাথে সামঞ্জস্যপূর্ণ উপায়ে জিনিসগুলি বীজগণিতগুলির উপাদানগুলিতে "সংযুক্তি" করার জন্য ভাল।


8

এই প্রশ্নের সর্বোত্তম উত্তরটি ব্রেন্ট ইয়ার্জির "টাইপক্লাসোপিডিয়া" তে পাওয়া যায়।

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

http://haskell.org/sitewiki/images/8/85/TMR-Issue13.pdf

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

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

চিয়ার্স


7

ইনরিয়ার ওয়েবসাইটে রয়েছে ও'রিলি ওক্যামল বইটিতে একটি দুর্দান্ত উদাহরণ রয়েছে (যা দুর্ভাগ্যক্রমে এটি লেখার ক্ষেত্রে নিচে)। ক্যালটেক দ্বারা ব্যবহৃত এই বইটিতে আমি খুব অনুরূপ উদাহরণ পেয়েছি: ওকামেলের পরিচিতি (পিডিএফ লিঙ্ক) । সম্পর্কিত বিভাগটি ফান্টেক্টরগুলির উপর অধ্যায়টি রয়েছে (বইয়ের পৃষ্ঠা ১৩৯, পিডিএফের 149 পৃষ্ঠা)।

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

তাদের একটি মডিউলও রয়েছে যা তুলনা ফাংশনটি কার্যকর করে যাতে এটি কোনও ক্ষেত্রে সংবেদনশীল স্ট্রিং তুলনা করে।

ফান্টর এবং মডিউলটি যে তুলনাটি প্রয়োগ করে তারা এক লাইনে একটি নতুন মডিউল তৈরি করতে পারে:

module SSet = MakeSet(StringCaseEqual);;

এটি একটি সেট ডেটা স্ট্রাকচারের জন্য একটি মডিউল তৈরি করে যা কেস সংবেদনশীল তুলনা ব্যবহার করে। যদি আপনি এমন একটি সেট তৈরি করতে চান যা ক্ষেত্রে সংবেদনশীল তুলনা ব্যবহার করে তবে আপনাকে নতুন ডেটা স্ট্রাকচার মডিউলের পরিবর্তে একটি নতুন তুলনা মডিউল প্রয়োগ করতে হবে।

টুবু ফ্যান্টেক্টরকে সি ++ তে টেমপ্লেটগুলির সাথে তুলনা করেছেন যা আমি মনে করি এটি বেশ উপযুক্ত।


6

অন্যান্য উত্তর এবং আমি এখন যা পোস্ট করতে চাই তা দেওয়া, আমি বলব যে এটি একটি বরং ভারী বোঝা শব্দ, তবে যাইহোক ...

হাস্কেলের 'ফান্টেক্টর' শব্দের অর্থ সম্পর্কিত একটি ইঙ্গিতের জন্য, জিএইচসিআইকে জিজ্ঞাসা করুন:

Prelude> :info Functor
class Functor f where
  fmap :: forall a b. (a -> b) -> f a -> f b
  (GHC.Base.<$) :: forall a b. a -> f b -> f a
        -- Defined in GHC.Base
instance Functor Maybe -- Defined in Data.Maybe
instance Functor [] -- Defined in GHC.Base
instance Functor IO -- Defined in GHC.Base

সুতরাং, মূলত, হাস্কেলের একটি ফান্টেক্টর এমন কিছু যা ম্যাপ করা যায়। এটির অন্যরকম বলার কারণ হ'ল ফান্টেক্টর এমন একটি জিনিস যা একটি ধারক হিসাবে বিবেচিত হতে পারে যা এতে থাকা মানকে রূপান্তর করতে কোনও প্রদত্ত ফাংশন ব্যবহার করতে বলা যেতে পারে; সুতরাং, তালিকাগুলির জন্য , এর fmapসাথে map, এর জন্য , ইত্যাদি etc.Maybefmap f (Just x) = Just (f x)fmap f Nothing = Nothing

Functor typeclass উপধারা এবং এর অধ্যায় Functors, আবেদন Functors এবং Monoids এর গ্রেট সদকাজের এক Haskell, আপনি শিখতে যেখানে এই বিশেষ ধারণা দরকারী কিছু উদাহরণ দেব। (একটি সারাংশ: প্রচুর জায়গা! :-))

নোট করুন যে কোনও মোনাদকে ফান্টাক্টর হিসাবে বিবেচনা করা যেতে পারে, এবং ক্রেগ স্টান্টজ উল্লেখ করেছেন যে, বেশিরভাগ ক্ষেত্রে ব্যবহৃত ফান্টেক্টর মনাদ হয়ে থাকে ... ওটো, ফন্টাকর টাইপক্লাসের কোনও উদাহরণ তৈরি করা সময়ে এটি সুবিধাজনক is এটিকে মোনাদ বানানোর ঝামেলা ছাড়াই। (উদাহরণস্বরূপ , উল্লিখিত পৃষ্ঠাগুলির একটিতে উল্লিখিত ZipListথেকে ) এর ক্ষেত্রে)Control.Applicative


5

এখানে একটি প্রোগ্রামিং পিওভের ফান্ট্যাক্টর সম্পর্কিত একটি নিবন্ধ রয়েছে , তারপরে আরও নির্দিষ্টভাবে অনুসরণ করা হয় যে তারা প্রোগ্রামিং ভাষাগুলিতে কীভাবে পৃষ্ঠায় আসে

একটি ফান্টারের ব্যবহারিক ব্যবহারটি একটি মোনাদে রয়েছে এবং আপনি যদি সন্ধান করেন তবে আপনি মনডে অনেক টিউটোরিয়াল খুঁজে পেতে পারেন।


1
"একটি ফান্টারের ব্যবহারিক ব্যবহার একটি মোনাদে রয়েছে" - কেবল তা নয়। সমস্ত মনাদ ফান্টেক্টর তবে নন-ম্যানড ফান্টেক্টরগুলির প্রচুর ব্যবহার রয়েছে।
amindfv

1
আমি বলব যে ফান্ট্যাক্টর ব্যবহারের জন্য মনডস অধ্যয়ন করা মুদি কিনতে গিয়ে রোলস সঞ্চয় করার মতো।
মার্কো ফাউস্টিনেলি

5

শীর্ষ ভোট প্রাপ্ত উত্তরের মন্তব্যে ব্যবহারকারী ওয়ে হু জিজ্ঞাসা করেছেন:

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

দ্রষ্টব্য : আমি এমএল জানি না, তাই দয়া করে ক্ষমা করুন এবং সম্পর্কিত কোনও ভুল সংশোধন করুন।

আসুন প্রাথমিকভাবে ধরে নেওয়া যাক আমরা 'বিভাগ' এবং 'ফান্টেক্টর' সংজ্ঞাগুলির সাথে পরিচিত।

একটি সংক্ষিপ্ত উত্তরটি হ'ল "হাস্কেল-ফান্টেক্টরগুলি" (এন্ডো-) ফান্টেক্টর F : Hask -> Haskএবং "এমএল-ফান্টেক্টর" ফান্টেক্টর G : ML -> ML'

এখানে, HaskHaskell প্রকার এবং তাদের মধ্যে ফাংশন দ্বারা গঠিত বিভাগ এবং একইভাবে MLএবং ML'এমএল স্ট্রাকচার দ্বারা সংজ্ঞায়িত বিভাগগুলি।

দ্রষ্টব্য : বিভাগ তৈরির সাথে কিছু প্রযুক্তিগত সমস্যা রয়েছে Haskতবে এগুলির চারপাশের উপায় রয়েছে।

বিভাগের তাত্ত্বিক দৃষ্টিকোণ থেকে, এর অর্থ Haskহ'ল-ফান্টর Fহ্যাস্কেল প্রকারের মানচিত্র :

data F a = ...

fmapহাস্কেল ফাংশনগুলির মানচিত্র সহ :

instance Functor F where
    fmap f = ...

এমএল বেশ একইরকম, যদিও fmapআমি জেনে নেই এমন কোনও আধ্যাত্মিক বিমূর্ততা নেই , সুতরাং আসুন আমরা একটি সংজ্ঞা দেই:

signature FUNCTOR = sig
  type 'a f
  val fmap: 'a -> 'b -> 'a f -> 'b f
end

সেটি হ'ল fমানচিত্র ML-প্রকার এবং fmapমানচিত্র- MLফাংশন, তাই

functor StructB (StructA : SigA) :> FUNCTOR =
struct
  fmap g = ...
  ...
end

একটি ফান্টেক্টর F: StructA -> StructB


5

"ফান্টর হ'ল অবজেক্টস এবং মরফিজমগুলির ম্যাপিং যা কোনও বিভাগের গঠন এবং পরিচয় সংরক্ষণ করে" "

একটি বিভাগ কি সংজ্ঞায়িত করা যাক?

এটা একগুচ্ছ বস্তু!

একটি বৃত্তের ভিতরে কয়েকটি বিন্দু আঁকুন (এখনের জন্য 2 টি বিন্দুর জন্য একটি 'অন্য' হ'ল 'বি') এবং আপাতত সেই বৃত্তটি এ (বিভাগ) এর নাম দিন।

বিভাগটি কী ধারণ করে?

প্রতিটি বস্তুর জন্য অবজেক্ট এবং আইডেন্টিটি ফাংশনের মধ্যে রচনা।

সুতরাং, আমাদের ফ্যাক্টর প্রয়োগের পরে আমাদের অবজেক্টগুলি ম্যাপ করতে হবে এবং রচনাটি সংরক্ষণ করতে হবে।

আসুন কল্পনা করা যাক 'এ' আমাদের ক্যাটাগরির যার অবজেক্ট ['a', 'b'] রয়েছে এবং সেখানে মরফিজম রয়েছে a -> b

এখন, আমাদের একটি ফান্টেক্টর সংজ্ঞায়িত করতে হবে যা এই বস্তুগুলি এবং মরফিজমগুলি অন্য একটি বিভাগ 'বি' তে ম্যাপ করতে পারে।

আসুন বলুন যে ফান্টারটিকে 'সম্ভবত' বলা হয়

data Maybe a = Nothing | Just a

সুতরাং, বিভাগ 'বি' এর মতো দেখাচ্ছে।

দয়া করে অন্য একটি বৃত্ত আঁকুন তবে এবার 'ক' এবং 'বি' এর পরিবর্তে 'সম্ভবত একটি' এবং 'সম্ভবত বি' দিয়ে।

সবকিছু ভাল মনে হচ্ছে এবং সমস্ত বস্তু ম্যাপ করা আছে

'ক' হয়ে উঠল 'হয়তো এ' এবং 'খ' 'সম্ভবত বি' হয়ে গেল।

তবে সমস্যাটি হ'ল আমাদের 'ক' থেকে 'বি' থেকেও মরফিজমটি ম্যাপ করতে হবে।

এর অর্থ হল 'এ' তে মরফিজম a -> খ এর মর্ফিজমে মানচিত্র করা উচিত 'সম্ভবত একটি' -> 'সম্ভবত বি'

a -> b এর morphism কে f বলা হয়, তারপরে 'হয়তো a' -> 'b হতে পারে' মরফিজমকে 'fmap f' বলা হয়

এখন আসুন দেখি যে 'এ' তে 'f' কী ফাংশন করছে এবং দেখুন আমরা এটি 'বি' তে প্রতিলিপি করতে পারি কিনা

'এ' এর 'চ' এর ফাংশন সংজ্ঞা:

f :: a -> b

f নেয় a এবং ফেরত খ

'বি' এর মধ্যে 'চ' এর ফাংশন সংজ্ঞা:

f :: Maybe a -> Maybe b

f লাগে সম্ভবত একটি এবং ফিরে সম্ভবত খ

'এ' থেকে 'বি' -তে 'fmap f' ফাংশন 'ফ' ফাংশনটি ম্যাপ করতে কীভাবে fmap ব্যবহার করতে হয় তা দেখতে দিন

এফএমএপি সংজ্ঞা

fmap :: (a -> b) -> (Maybe a -> Maybe b)
fmap f Nothing = Nothing
fmap f (Just x) = Just(f x)

তো, আমরা এখানে কি করছি?

আমরা 'f' ফাংশনটি 'x' তে প্রয়োগ করছি যা 'এ' টাইপযুক্ত। 'Nothing' বিশেষ প্যাটার্ন ম্যাচিং সংজ্ঞা থেকে আসে Functor Maybe

সুতরাং, আমরা আমাদের বিষয়গুলি [a, b] এবং morphism [f] কে 'এ' থেকে 'বি' বিভাগে ম্যাপিং করেছি।

ঠাঁই ফ্যান্টর!

এখানে চিত্র বর্ণনা লিখুন


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

3

রুক্ষ ওভারভিউ

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

ফান্টেক্টরের উদাহরণগুলির মধ্যে অ্যারে, "হতে পারে" এবং "হয়" ফান্টেক্টর, ফিউচার (উদাহরণস্বরূপ https://github.com/Avaq/Fl ভবিষ্যত দেখুন ) এবং আরও অনেকগুলি অন্তর্ভুক্ত রয়েছে।

চিত্রণ

প্রথম এবং শেষ নামগুলি থেকে পুরো ব্যক্তির নাম তৈরির ফাংশনটি বিবেচনা করুন। আমরা এটি fullName(firstName, lastName)দুটি আর্গুমেন্টের ফাংশন হিসাবে সংজ্ঞায়িত করতে পারি , যা ফ্যান্টেক্টরদের পক্ষে উপযুক্ত হবে না যা কেবলমাত্র একটি যুক্তির ফাংশন নিয়ে কাজ করে। প্রতিকারের জন্য, আমরা সমস্ত যুক্তি একটি একক বস্তুতে সংগ্রহ করি nameযা এখন ফাংশনের একক যুক্তিতে পরিণত হয়:

// In JavaScript notation
fullName = name => name.firstName + ' ' + name.lastName

এখন যদি আমাদের অ্যারেতে অনেক লোক থাকে? ম্যানুয়ালি তালিকার বাইরে চলে যাওয়ার পরিবর্তে, আমরা সংক্ষিপ্ত একক লাইন কোডের সাথে অ্যারের জন্য সরবরাহিত পদ্ধতিটির fullNameমাধ্যমে আমাদের ফাংশনটি পুনরায় ব্যবহার করতে পারি map:

fullNameList = nameList => nameList.map(fullName)

এবং এটি পছন্দ করুন

nameList = [
    {firstName: 'Steve', lastName: 'Jobs'},
    {firstName: 'Bill', lastName: 'Gates'}
]

fullNames = fullNameList(nameList) 
// => ['Steve Jobs', 'Bill Gates']

এটি কার্যকর হবে, যখনই আমাদের প্রতিটি এন্ট্রি nameListউভয়ই firstNameএবং lastNameসম্পত্তি সরবরাহ করে। তবে কিছু জিনিস যদি না (বা এমনকি বস্তুগুলি নাও হয়)? ত্রুটিগুলি এড়ানোর জন্য এবং কোডটি আরও নিরাপদ করার জন্য আমরা আমাদের বস্তুগুলিকে Maybeপ্রকারের মধ্যে আবদ্ধ করতে পারি (উদাহরণস্বরূপ https://sanctury.js.org/#maybe-type ):

// function to test name for validity
isValidName = name => 
    (typeof name === 'object') 
    && (typeof name.firstName === 'string')
    && (typeof name.lastName === 'string')

// wrap into the Maybe type
maybeName = name => 
    isValidName(name) ? Just(name) : Nothing()

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

// Maybe Object -> Maybe String
maybeFullName = maybeName => maybeName.map(fullName)

এবং এটি পছন্দ করুন

justSteve = maybeName(
    {firstName: 'Steve', lastName: 'Jobs'}
) // => Just({firstName: 'Steve', lastName: 'Jobs'})

notSteve = maybeName(
    {lastName: 'SomeJobs'}
) // => Nothing()

steveFN = maybeFullName(justSteve)
// => Just('Steve Jobs')

notSteveFN = maybeFullName(notSteve)
// => Nothing()

বিভাগ তত্ত্ব

একজন Functor মধ্যে শ্রেণী তত্ত্ব দুটি বিভাগ তাদের morphisms রচনা সম্মান মধ্যে একটি মানচিত্র। একটি কম্পিউটার ভাষা , সুদের প্রধান শ্রেণী যার হয় বস্তু হয় ধরনের (মূল্যবোধের নির্দিষ্ট সেট), এবং যার morphisms হয় ফাংশন f:a->bএক ধরনের থেকে aঅন্য ধরনের b

উদাহরণস্বরূপ, নিতে aহতে Stringধরন, bনম্বর টাইপ করুন, এবং fফাংশন তার দৈর্ঘ্য মধ্যে একটি স্ট্রিং ম্যাপিং হল:

// f :: String -> Number
f = str => str.length

এখানে a = Stringসমস্ত স্ট্রিংয়ের b = Numberসেট এবং সমস্ত সংখ্যার সেট উপস্থাপন করা হয়। যে অর্থে, উভয় aএবং bবস্তু প্রতিনিধিত্ব সেট শ্রেণী (যা ঘনিষ্ঠভাবে পার্থক্য অদরকারী এখানে হচ্ছে ধরনের শ্রেণীবিভাগের উপর নিরভরশীল নেই)। সেট বিভাগে, দুটি সেটগুলির মধ্যে আকারগুলি প্রথম সেট থেকে দ্বিতীয়টিতে অবিকল সমস্ত ফাংশন। সুতরাং fএখানে আমাদের দৈর্ঘ্যের ফাংশনটি স্ট্রিংয়ের সেট থেকে সংখ্যার সেটে একটি রূপচর্চা।

যেহেতু আমরা কেবল সেট বিভাগটি বিবেচনা করি, এর থেকে প্রাসঙ্গিক ফ্যান্ট্যাক্টররা নিজেরাই অবজেক্টগুলিকে বস্তুগুলিকে এবং মরফিজমে মরফিজমগুলিতে প্রেরণ করে এমন মানচিত্র যা নির্দিষ্ট বীজগণিত আইনকে সন্তুষ্ট করে।

উদাহরণ: Array

Arrayঅনেকগুলি জিনিস বোঝাতে পারে তবে কেবল একটি জিনিস হ'ল ফান্ট্যাক্ট - টাইপ কনস্ট্রাক্ট, aটাইপের [a]সমস্ত অ্যারে টাইপের মধ্যে ম্যাপিং করে a। উদাহরণস্বরূপ, Arrayফান্টর প্রকারটি String টাইপ করে [String](স্বেচ্ছাসেবী দৈর্ঘ্যের সমস্ত অ্যারের সেট), এবং সেট প্রকারটিকে Numberসংশ্লিষ্ট ধরণের [Number](সংখ্যার সমস্ত অ্যারেগুলির সেট ) মধ্যে ম্যাপ করে ।

ফান্টেক্টর মানচিত্রটিকে বিভ্রান্ত না করা গুরুত্বপূর্ণ

Array :: a => [a]

একটি আকারে সঙ্গে a -> [a]। Functor কেবল মানচিত্র (সহযোগীদের) টাইপ aটাইপ মধ্যে [a]অন্য এক জিনিস না। প্রতিটি প্রকারটি আসলে উপাদানগুলির একটি সেট, এখানে এখানে কোনও প্রাসঙ্গিকতা নেই। বিপরীতে, একটি মরফিজম সেই সেটগুলির মধ্যে একটি আসল ফাংশন। উদাহরণস্বরূপ, একটি প্রাকৃতিক আকার আছে (ফাংশন)

pure :: a -> [a]
pure = x => [x]

যা একক এন্ট্রি হিসাবে সেই মান সহ 1-উপাদান অ্যারেতে একটি মান প্রেরণ করে। সেই ফাংশনটি ফান্টাক্টরের কোনও অংশ নয়Array ! এই ফান্টারের দৃষ্টিকোণ থেকে, অন্য যেগুলির pureমতো কেবল একটি ফাংশন, বিশেষ কিছু নয়।

অন্যদিকে, Arrayফান্টাকারের দ্বিতীয় অংশ রয়েছে - মরফিজমের অংশ। কোনটি morphism মানচিত্র f :: a -> bএকটি morphism মধ্যে [f] :: [a] -> [b]:

// a -> [a]
Array.map(f) = arr => arr.map(f)

এখানে arrটাইপ মান নির্বিচারে দৈর্ঘ্যের কোনো অ্যারে a, এবং arr.map(f)টাইপ মান সঙ্গে একই দৈর্ঘ্যের অ্যারে b, যার এন্ট্রি প্রয়োগের ফলাফল নেই fএর টি এন্ট্রির মধ্যে arr। এটিকে ফান্টাকর করার জন্য, পরিচয়ের সাথে পরিচয়ের মানচিত্র তৈরির গাণিতিক আইন এবং রচনাগুলিতে রচনাগুলি আবশ্যক, যা এই Arrayউদাহরণে পরীক্ষা করা সহজ ।


2

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

জাভাতে রান্নেবল ইন্টারফেসের একটি উদাহরণ, যার কেবল একটি পদ্ধতি রয়েছে: রান।

জাভাস্ক্রিপ্টে প্রথমে এই উদাহরণটি বিবেচনা করুন, এতে প্রথম শ্রেণির ফাংশন রয়েছে:

[1, 2, 5, 10].map(function(x) { return x*x; });

আউটপুট: [1, 4, 25, 100]

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

একই জিনিসটি করতে জাভা, একটি ফান্টেক্টর ব্যবহার করে, আপনাকে প্রথমে একটি ইন্টারফেস সংজ্ঞায়িত করতে হবে, বলুন:

public interface IntMapFunction {
  public int f(int x);
}

তারপরে, আপনি যদি মানচিত্রের ফাংশন সহ কোনও সংগ্রহ শ্রেণি যুক্ত করেন তবে আপনি এটি করতে পারেন:

myCollection.map(new IntMapFunction() { public int f(int x) { return x * x; } });

এটি একটি ফান্টর তৈরি করতে IntMapFunction এর একটি লাইন সাবক্লাস ব্যবহার করে, যা পূর্ববর্তী জাভাস্ক্রিপ্ট উদাহরণ থেকে ফাংশনের ওও সমতুল্য।

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

তথ্যসূত্র: http://en.wikedia.org/wiki/Function_object


আসলে "ফাংশন অবজেক্ট" কোনও ফান্টারের সঠিক বর্ণনা নয়। যেমন Arrayএকটি ফান্টেক্টর তবে Array(value)কেবল 1-এলিমেন্ট অ্যারে দেয়।
দিমিত্রি জইতসেভ

0

কিআইএসএস: ফান্টেক্টর এমন একটি জিনিস যা মানচিত্রের পদ্ধতিতে থাকে।

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

src: https://www.youtube.com/watch?v=DisD9ftUyCk&feature=youtu.be&t=76


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

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

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

Arrayটাইপ কনস্ট্রাক্ট একটি একক ফান্টেক্টর সংজ্ঞায়িত করে। এর উদাহরণগুলি "অ্যারে" নামেও পরিচিত তবে তারা ফান্টেক্টর নয়। এখানে বর্ণনাটি আরও সুনির্দিষ্ট করা উচিত।
দিমিত্রি জইতসেভ

@ দিমিত্রিজাইতসেভ আপনি কি বিস্তারিত বর্ণনা করতে পারেন? সুতরাং আপনি কি বলছেন যে দৃষ্টান্তগুলি ফান্টেক্টর নয়? আপনি যেটির উপর ম্যাপিংয়ের মাধ্যমে একটি নতুন ফান্টর পান সেজন্য আমি এটি দেখতে পেলাম না।
সাউন্ডোগি

-4

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


-6

সহজ কথায় বলতে গেলে, একটি ফান্টেক্টর, বা ফাংশন অবজেক্ট, এমন একটি শ্রেণি অবজেক্ট যা ফাংশনের মতোই বলা যেতে পারে।

সি ++ এ:

এইভাবে আপনি একটি ফাংশন লিখুন

void foo()
{
    cout << "Hello, world! I'm a function!";
}

এভাবেই আপনি কোনও ফান্টেক্টর লেখেন

class FunctorClass
{
    public:
    void operator ()
    {
        cout << "Hello, world! I'm a functor!";
    }
};

এখন আপনি এটি করতে পারেন:

foo(); //result: Hello, World! I'm a function!

FunctorClass bar;
bar(); //result: Hello, World! I'm a functor!

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


12
না, এই ফান্টেক্টরগুলি এফপি ভাষা ব্যবহার করে এমন তত্ত্বের ধারণা নয়।
টুবু

1
আমি দেখতে পাচ্ছি যে কীভাবে একজন প্রমাণ করতে পারে যে FunctorClassপ্রথম ফান্টর আইন পূরণ করে, তবে আপনি কি দ্বিতীয় আইনের প্রমাণ প্রমাণ করতে পারেন? আমি বেশ দেখতে পাচ্ছি না।
Jörg ডব্লু মিটাগ

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

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

-10

Functor বিশেষত ক্রিয়ামূলক প্রোগ্রামিং সম্পর্কিত নয়। এটি কোনও ফাংশন বা কোনও ধরণের অবজেক্টের কেবল একটি "পয়েন্টার", এটি ফাংশন হিসাবে বলা যেতে পারে।


8
ফান্টারের একটি নির্দিষ্ট এফপি ধারণা রয়েছে (বিভাগের তত্ত্ব থেকে), তবে আপনি ঠিক বলেছেন যে একই শব্দটি নন-এফপি ভাষায় অন্যান্য জিনিসের জন্যও ব্যবহৃত হয়।
ক্রেগ স্টান্টজ

আপনি কি নিশ্চিত যে ফাংশন পয়েন্টারগুলি ফান্টেক্টর? আমি দেখতে পাই না যে কীভাবে ফাংশন পয়েন্টারগুলি দুটি ফান্টর আইনগুলি পূরণ করে, বিশেষত দ্বিতীয় ফান্টর আইন (মোর্ফিজম রচনা সংরক্ষণ) fulfill আপনি কি তার জন্য একটি প্রমাণ আছে? (কেবল একটি মোটামুটি স্কেচ।)
জার্গ ডব্লু মিটাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.