ফ্যান্টেক্টর / ফ্যান্টেক্টর / প্রয়োগকারী / মোনাড নয় এর ভাল উদাহরণগুলি?


209

এক ধরণের দশম কী তা কাউকে ব্যাখ্যা করার সময় আমি ডেটা স্ট্রাকচারের সঠিক উদাহরণগুলি খুঁজে পেতে লড়াই করছি যা হ'ল এক্স X

সুতরাং, আমি উদাহরণগুলির জন্য অনুরোধ করছি:

  • একটি টাইপ কনস্ট্রাক্টর যা ফান্টেক্টর নয়।
  • একটি টাইপ কনস্ট্রাক্টর যা ফান্টেক্টর তবে প্রয়োগকারী নয়।
  • একটি প্রকারের কনস্ট্রাক্টর যা আবেদনকারী তবে এটি মোনাদ নয়।
  • একটি টাইপ কনস্ট্রাক্টর যা একটি মোনাড।

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

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

যদি কেউ এই শ্রেণিবিন্যাসের কোথাও তীরের উদাহরণ অনুসন্ধান করতে সক্ষম হয় (এটি প্রয়োগকারী এবং মোনাডের মধ্যে রয়েছে?), এটিও দুর্দান্ত হবে!


4
এটা এক ধরনের কন্সট্রাক্টর (করা কি সম্ভব * -> *), যার জন্য অস্তিত্ব আছে কোন উপযুক্ত fmap?
ওয়েন

1
ওভেন, আমার মনে a -> Stringহয় কোনও ফান্টেক্টর নয়।
রোটসর

3
@ রটসর @ ওউন a -> Stringএকটি গাণিতিক ফান্টেক্টর , তবে হাস্কেল নয় Functor, পরিষ্কার হতে পারে।
জে আব্রাহামসন

@J। আব্রাহামসন, কোন অর্থে এটি গাণিতিক ফান্টেক্টর? আপনি কি তীরগুলি বিপরীত করে বিভাগের বিষয়ে কথা বলছেন?
রোটসর 21

3
লোক তা জানে না, একটি contravariant functor প্রকারের একটি fmap হয়েছে(a -> b) -> f b -> f a
AJFarmar

উত্তর:


100

একটি ধরণের নির্মাতা যা কোনও ফান্টেক্টর নয়:

newtype T a = T (a -> Int)

আপনি এটির বাইরে একটি ছদ্মবেশী ফান্টেক্টর তৈরি করতে পারেন তবে কোনও (covariant) ফান্টেক্টর নয়। লেখার চেষ্টা করুন fmapএবং আপনি ব্যর্থ হবেন। নোট করুন যে বিপরীত ফান্টর সংস্করণটি বিপরীত:

fmap      :: Functor f       => (a -> b) -> f a -> f b
contramap :: Contravariant f => (a -> b) -> f b -> f a

একটি ধরণের নির্মাতা যা একটি ফান্টেক্টর তবে প্রয়োগকারী নয়:

আমার ভাল উদাহরণ নেই। আছে Const, তবে আদর্শভাবে আমি একটি কংক্রিট নন-মোনয়েড চাই এবং আমি কোনওটিই ভাবতে পারি না। সমস্ত ধরণের হ'ল মূলত সংখ্যাসূচক, গণনা, পণ্য, অঙ্ক বা ফাংশন থাকে যখন আপনি এতে নামেন। আপনি pigworker নিচে দেখুন পারেন এবং আমি কিনা কথা অস্বীকার Data.Voidএকটি হল Monoid;

instance Monoid Data.Void where
    mempty = undefined
    mappend _ _ = undefined
    mconcat _ = undefined

যেহেতু _|_হাস্কেলের একটি আইনী মূল্য এবং বাস্তবে এর একমাত্র আইনী মূল্য তাই Data.Voidএটি মনোয়েড বিধিগুলি পূরণ করে। এর unsafeCoerceসাথে কী করতে হবে তা সম্পর্কে আমি নিশ্চিত নই , কারণ আপনি কোনও unsafeফাংশন ব্যবহার করার সাথে সাথে আপনার প্রোগ্রামটি এখন আর হাস্কেল শব্দার্থবিধি লঙ্ঘন না করার গ্যারান্টিযুক্ত ।

নীচে ( লিঙ্ক ) বা অনিরাপদ ফাংশন ( লিঙ্ক ) এর নিবন্ধের জন্য হাস্কেল উইকি দেখুন ।

আমি অবাক হই যে আরও বেশি এক্সটেনশন সহ আগদা বা হাস্কেলের মতো সমৃদ্ধ ধরণের সিস্টেম ব্যবহার করে এই জাতীয় ধরণের কনস্ট্রাক্টর তৈরি করা সম্ভব কিনা।

একটি প্রকারের নির্মাতা যা আবেদনকারী, তবে একটি মোনাড নয়:

newtype T a = T {multidimensional array of a}

আপনি এটির থেকে প্রযোজ্য তৈরি করতে পারেন, এর মতো কিছু দিয়ে:

mkarray [(+10), (+100), id] <*> mkarray [1, 2]
  == mkarray [[11, 101, 1], [12, 102, 2]]

তবে আপনি যদি এটিকে মোনাদ তৈরি করেন তবে আপনি একটি মাত্রার অমিল পেতে পারেন। আমি সন্দেহ করি যে এরকম উদাহরণগুলি বাস্তবে বিরল।

একটি টাইপ কনস্ট্রাক্টর যা একটি মোনাড:

[]

তীর সম্পর্কে:

এই শ্রেণিবিন্যাসের উপর একটি তীর কোথায় রয়েছে তা জিজ্ঞাসা করা হল "লাল" কি ধরণের আকৃতি তা জিজ্ঞাসার মতো। সদৃশ অমিল লক্ষ করুন:

Functor :: * -> *
Applicative :: * -> *
Monad :: * -> *

কিন্তু,

Arrow :: * -> * -> *

3
ভাল তালিকা! আমি Either aশেষের ক্ষেত্রে উদাহরণ হিসাবে সহজ কিছু ব্যবহার করার পরামর্শ দিচ্ছি , কারণ এটি বোঝা সহজ।
ফুজ

6
আপনি যদি এখনও এমন কোনও নির্মাণকারীর সন্ধান করেন যা আবেদনকারী তবে একটি মোনাড নয়, তবে একটি সাধারণ উদাহরণ হবে ZipList
জন এল

23
_|_* প্রতিটি প্রকারে বাস করে তবে এর বিন্দুটি Voidহ'ল একটি নির্মাণের জন্য আপনাকে পিছনের দিকে বাঁকানো উচিত বা আপনি এর মানটি নষ্ট করেছেন। এই জন্যই তার Enum, Monoid, ইত্যাদি না একটি দৃষ্টান্ত আপনি ইতিমধ্যে আপনার একটি, আমি আপনাকে তাদের একসঙ্গে ম্যাশ দিন খুশি (যদি আপনি দান Semigroup) কিন্তু mempty, কিন্তু আমি স্পষ্টভাবে ধরনের একটি মান নির্মাণের জন্য কোন টুলস দিতে Voidমধ্যে void। আপনাকে বন্দুকটি লোড করতে হবে এবং এটিকে আপনার পায়ে নির্দেশ করতে হবে এবং ট্রিগারটি নিজেই টানতে হবে।
এডওয়ার্ড কেএমইটিটি

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

1
@ অ্যালেক্সভং: "অবহেলিত" -> লোকেরা কেবল একটি আলাদা প্যাকেজ ব্যবহার করছে। "কনট্র্যাভারিয়েন্ট ফান্টেক্টর" সম্পর্কে "ফান্টারের দ্বৈত" নয়, বিভ্রান্তির জন্য দুঃখিত। কিছু প্রসঙ্গে আমি "cofunctor" দেখেছি "বিপরীতমুখী ফান্টেক্টর" হিসাবে উল্লেখ করতাম কারণ ফান্টেক্টরগুলি স্ব-দ্বৈত, তবে এটি কেবল বিভ্রান্তিকর লোক হিসাবে দেখা দেয়।
ডায়েটারিচ এপ্পি

87

আমার স্টাইলটি আমার ফোন দিয়ে সংকোচিত হতে পারে, তবে এখানে যায়।

newtype Not x = Kill {kill :: x -> Void}

ফ্যান্টেক্টর হতে পারে না। যদি তা হত, আমরা থাকতাম

kill (fmap (const ()) (Kill id)) () :: Void

এবং চাঁদ সবুজ পনির দিয়ে তৈরি করা হত।

এদিকে

newtype Dead x = Oops {oops :: Void}

একটি ফান্টেক্টর

instance Functor Dead where
  fmap f (Oops corpse) = Oops corpse

তবে প্রয়োগকারী হতে পারে না, বা আমরা চাই

oops (pure ()) :: Void

এবং সবুজ মুন পনির দিয়ে তৈরি হত (যা আসলে ঘটতে পারে তবে কেবল সন্ধ্যায় in

(অতিরিক্ত নোট: Void, হিসাবে Data.Voidএকটি খালি ডাটাটাইপ হয় আপনি ব্যবহার করতে চেষ্টা করে। undefined, এটি একটি Monoid এর প্রমাণ করার আমি ব্যবহার করব unsafeCoerceপ্রমাণ করতে হবে যে তা না হয়।)

আনন্দের,

newtype Boo x = Boo {boo :: Bool}

বিভিন্ন উপায়ে প্রয়োগযোগ্য, যেমন, ডিজকস্ট্রের যেমনটি ছিল,

instance Applicative Boo where
  pure _ = Boo True
  Boo b1 <*> Boo b2 = Boo (b1 == b2)

তবে এটি কোনও মোনাড হতে পারে না। কেন নয় তা দেখতে, লক্ষ্য করুন যে ফিরতে হবে নিয়মিত Boo Trueবা Boo False, এবং তাই

join . return == id

সম্ভবত ধরে রাখতে পারে না।

হ্যাঁ, আমি প্রায় ভুলে গেছি

newtype Thud x = The {only :: ()}

একটি Monad হয়। আপনার নিজের রোল।

ধরার জন্য বিমান ...


8
শূন্য ফাঁকা! নৈতিকভাবে, যাই হোক না কেন।
পিগ ওয়ার্কার

9
আমি মনে করি 0 টি কনস্ট্রাক্টর সহ শূন্যতা একটি প্রকারের। এটি কোনও মনয়েড নয় কারণ নেই mempty
রোটসর

6
undefined? কি অভদ্র! দুর্ভাগ্যক্রমে, অনিরাপদকরেস (অনিরাপদকর্স () <*> অপরিজ্ঞাত) নয় (), তাই বাস্তব জীবনে এমন কিছু পর্যবেক্ষণ রয়েছে যা আইন লঙ্ঘন করে।
পিগ ওয়ার্কার

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

22
অনেক কিছু সম্পর্কে_|_
ল্যান্ডেই ২১ আগস্ট'১১: 21

71

আমি বিশ্বাস করি যে অন্যান্য উত্তরগুলি কিছু সাধারণ এবং সাধারণ উদাহরণ মিস করেছে:

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

instance Functor ((,) r) where
    fmap f (x,y) = (x, f y)

কিন্তু কোন উপায় কিভাবে তার সংজ্ঞায়িত হয় Applicativeউপর অতিরিক্ত বিধিনিষেধ মনোরম ছাড়া উদাহরণস্বরূপ r। বিশেষত, pure :: a -> (r, a)কোনও স্বেচ্ছাচারিতার জন্য কীভাবে সংজ্ঞা দেওয়া যায় তার কোনও উপায় নেই r

একটি প্রকারের কনস্ট্রাক্টর যা আবেদনকারী তবে এটি মোনাদ নয়। একটি সুপরিচিত উদাহরণ হ'ল জিপলিস্ট । (এটি এমন একটি newtypeযা তালিকা মোড়ানো এবং Applicativeতাদের জন্য আলাদা উদাহরণ সরবরাহ করে))

fmapস্বাভাবিকভাবে সংজ্ঞায়িত করা হয়। কিন্তু pureএবং <*>হিসাবে সংজ্ঞায়িত করা হয়

pure x                    = ZipList (repeat x)
ZipList fs <*> ZipList xs = ZipList (zipWith id fs xs)

তাই pureদেওয়া মান পুনরায় ব্যবহার করে অসীম তালিকা তৈরি করে, এবং <*>মূল্যবোধের একটি তালিকা সঙ্গে ফাংশন একটি তালিকা পিন - প্রযোজ্য আমি করতে -th ফাংশন আমি -th উপাদান। (আদর্শ <*>উপর []প্রয়োগের সব সম্ভাব্য সমাহার উত্পাদন করে আমি করতে -th ফাংশন -th উপাদান।) কিন্তু কোন যুক্তিসম্মত পথ কিভাবে একসংখ্যা (দেখুন সংজ্ঞায়িত হয় এই পোস্টে )।


কীভাবে তীরগুলি ফান্টেক্টর / প্রয়োগক / মোনাড শ্রেণিবিন্যাসের সাথে ফিট করে? দেখুন আইডিয়ামগুলি বিস্মৃত, তীরগুলি নিখুঁত, স্যাম লিন্ডলি, ফিলিপ ওয়েডলার, জেরেমি ইয়ালাপের দ্বারা মনমুগ্ধদের প্রত্যাখ্যান করা হয়েছে। MSFP 2008. (তারা আবেদন functors কল বাগধারার ।) বিমূর্ত:

আমরা গণনার তিনটি ধারণার মধ্যে সংযোগটি পুনর্বিবেচনা করি: মোগির মনাদ, হিউজের তীর এবং ম্যাকব্রাইড এবং প্যাটারসনের আইডিয়মস (একে আবেদনকারী ফান্টেক্টরও বলা হয়)। আমরা দেখাব যে আইডিয়োমগুলি তীরের সমতুল্য যা টাইপ আইসোমর্ফিজম এ ~> বি = 1 ~> (এ -> বি) কে সন্তুষ্ট করে এবং যে মনদাসগুলি তীরের সমতুল্য যা আইসোমরফিজম A ~> B = A -> (1 ~ টাইপকে সন্তুষ্ট করে) > খ)। আরও, আইডিয়ামগুলি তীরগুলি এবং তীরগুলিতে এমবেড এমনেডে থাকে mon


1
সুতরাং ((,) r)একটি ফান্টেক্টর যা প্রয়োগকারী নয়; কিন্তু এই শুধুমাত্র কারণ আপনার সাধারণত সংজ্ঞায়িত না পারে pureসবার জন্য rএকবারে। সুতরাং এক সংজ্ঞা সঙ্গে আবেদন functors একজন (অসীম) সংগ্রহে সংজ্ঞায়িত করতে চেষ্টা ভাষা সংক্ষিপ্তকরনের একটি ছল আছে, pureএবং <*>; এই অর্থে, এই কাউন্টার-উদাহরণ সম্পর্কে গাণিতিকভাবে গভীর কিছু নেই বলে মনে হয় না, যেহেতু কোনও কংক্রিটের জন্য r, একটি আবেদনকারী ফান্টর করা ((,) r) যেতে পারে। প্রশ্ন: আপনি কোনও কনক্রিট ফান্টারের কথা ভাবতে পারেন যা আবেদনকারী হতে ব্যর্থ হয়?
জর্জ

1
এই প্রশ্নের পোস্ট হিসাবে স্ট্যাকওভারফ্লো / প্রশ্ন / 44125484/… দেখুন ।
জর্জ

20

টাইপ কনস্ট্রাক্টরের জন্য একটি ভাল উদাহরণ যা ফান্টেক্টর নয় Set: আপনি প্রয়োগ করতে পারবেন না fmap :: (a -> b) -> f a -> f b, কারণ অতিরিক্ত বাধা ছাড়া Ord bআপনি নির্মাণ করতে পারবেন না f b


16
এটি আসলে গাণিতিকভাবে একটি ভাল উদাহরণ যা আমরা সত্যই এটি একটি ফান্টেক্টর বানাতে চাই।
আলেকজান্দ্র সি।

21
@AlexandreC। আমি তাতে একমত নই, এটি ভাল উদাহরণ নয়। গাণিতিকভাবে, এই জাতীয় ডেটা স্ট্রাকচার একটি ফান্টিকার গঠন করে। আমরা বাস্তবায়ন করতে পারি না তা fmapহ'ল একটি ভাষা / বাস্তবায়ন সমস্যা। এছাড়াও, Setধারাবাহিকতা মোনাডে গুটিয়ে ফেলা সম্ভব , যা আমরা আশা করি এমন সমস্ত সম্পত্তি দিয়ে এটি একটি মনড তৈরি করে দেয়, এই প্রশ্নটি দেখুন (যদিও এটি দক্ষতার সাথে করা যায় কিনা তা আমি নিশ্চিত নই)।
পেটর পুদলেক

@ পেটারপুদলক, এটি একটি ভাষার সমস্যা কীভাবে? সাম্য bঅনস্বীকার্য হতে পারে , সেক্ষেত্রে আপনি সংজ্ঞা দিতে পারবেন না fmap!
ট্যুরিওন

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

এমনকি যদি আমরা এই ordসীমাবদ্ধতাটি কাটিয়ে উঠতে পারি যে Setকোনওটিতে সদৃশ এন্ট্রি থাকতে পারে না তার অর্থ fmapপ্রসঙ্গটি বেদনা দিতে পারে। এটি সমিতি আইন লঙ্ঘন করে।
জন এফ মিলার

11

আমি এই প্রশ্নের উত্তর দেওয়ার জন্য আরও নিয়মতান্ত্রিক পদ্ধতির প্রস্তাব দিতে চাই এবং এমন উদাহরণও দেখাতে চাই যা "নীচে" মান বা অসীম ডেটা ধরণের বা এর মতো কোনও বিশেষ কৌশল ব্যবহার করে না।

যখন টাইপ কনস্ট্রাক্টররা টাইপ বর্গের উদাহরণগুলি ব্যর্থ করে?

সাধারণত, দুটি ধরণের নির্মাতা একটি নির্দিষ্ট ধরণের শ্রেণীর উদাহরণ পেতে ব্যর্থ হতে পারে তার দুটি কারণ রয়েছে:

  1. প্রকার শ্রেণি থেকে প্রয়োজনীয় পদ্ধতির ধরণের স্বাক্ষরগুলি প্রয়োগ করতে পারে না।
  2. প্রকার স্বাক্ষরগুলি প্রয়োগ করতে পারে তবে প্রয়োজনীয় আইনগুলি সন্তুষ্ট করতে পারে না।

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

নির্দিষ্ট উদাহরণ

  • একটি টাইপ কনস্ট্রাক্টর যাতে ফান্টর উদাহরণ থাকতে পারে না কারণ প্রকারটি প্রয়োগ করা যায় না:

    data F z a = F (a -> z)

টাইপ প্যারামিটারের ক্ষেত্রে এটি একটি সংশ্লেষকারী, ফান্টেক্টর নয় a, কারণ aবিপরীতমুখী অবস্থানে রয়েছে। টাইপ স্বাক্ষর সহ কোনও ফাংশন বাস্তবায়ন করা অসম্ভব (a -> b) -> F z a -> F z b

  • এমন ধরণের কনস্ট্রাক্টর যা বৈধ ফান্টেক্টর নয় যদিও এর ধরণের স্বাক্ষরের fmapপ্রয়োগ করা যেতে পারে:

    data Q a = Q(a -> Int, a)
    fmap :: (a -> b) -> Q a -> Q b
    fmap f (Q(g, x)) = Q(\_ -> g x, f x)  -- this fails the functor laws!

এই উদাহরণে জানতে আগ্রহী দৃষ্টিভঙ্গি যে আমরা হয় পারেন বাস্তবায়ন fmapসঠিক ধরনের যদিও Fসম্ভবত একটি functor হতে পারবেন না কারণ এটি ব্যবহার aএকটি contravariant অবস্থানে। সুতরাং fmapউপরে প্রদর্শিত এই বাস্তবায়নটি বিভ্রান্তিমূলক - যদিও এর সঠিক ধরণের স্বাক্ষর রয়েছে (আমি বিশ্বাস করি এটি এই ধরণের স্বাক্ষরের একমাত্র সম্ভাব্য বাস্তবায়ন), ফান্টারের আইনগুলি সন্তুষ্ট নয়। উদাহরণস্বরূপ, fmap idid, কারণ let (Q(f,_)) = fmap id (Q(read,"123")) in f "456"হয় 123, কিন্তু let (Q(f,_)) = id (Q(read,"123")) in f "456"হয় 456

প্রকৃতপক্ষে, Fএটি কেবলমাত্র একটি অনুষঙ্গ, - এটি না কোনও ফান্টেক্টর এবং না কোনও কনট্রাক্টাক্টর।

  • একটি আইনী ফান্টেক্টর যা প্রয়োগযোগ্য নয় কারণ প্রকারের স্বাক্ষরটি pureপ্রয়োগ করা যায় না: লেখক মোনাড নিন (a, w)এবং একরকম wহওয়া সীমাবদ্ধতাটি সরিয়ে দিন । তখন টাইপের (a, w)বাইরে মান নির্ধারণ করা অসম্ভব a

  • একজন functor যে আবেদন নয় কারণ ধরণ স্বাক্ষর <*>করতে পারেন না বাস্তবায়িত হবে: data F a = Either (Int -> a) (String -> a)

  • ধরণের শ্রেণিবদ্ধ পদ্ধতি প্রয়োগ করা যেতে পারে এমন একটি ফান্টর যা আইনী প্রয়োগযোগ্য নয় :

    data P a = P ((a -> Int) -> Maybe a)

টাইপ কনস্ট্রাক্টর Pএকটি ফান্টেক্টর কারণ এটি aকেবল সমবায়ীয় অবস্থানগুলিতে ব্যবহার করে।

instance Functor P where
   fmap :: (a -> b) -> P a -> P b
   fmap fab (P pa) = P (\q -> fmap fab $ pa (q . fab))

স্বাক্ষর প্রকারের একমাত্র সম্ভাব্য বাস্তবায়ন <*>হ'ল একটি ফাংশন যা সর্বদা ফিরে আসে Nothing:

 (<*>) :: P (a -> b) -> P a -> P b
 (P pfab) <*> (P pa) = \_ -> Nothing  -- fails the laws!

তবে এই বাস্তবায়ন আবেদনকারী ফান্ট্যাক্টরদের জন্য পরিচয় আইন পূরণ করে না।

  • এমন ফান্টেক্টর যা এটি Applicativeনয় তবেMonad এর ধরণের স্বাক্ষরটি bindপ্রয়োগ করা যায় না।

এরকম কোনও উদাহরণ আমার জানা নেই!

  • একটি ফান্টেক্টর যা তবে Applicativeতা নয়Monad কারণ আইনগুলি স্বাক্ষর bindকরতে না পারলেও এর স্বাক্ষরের প্রকারটি কার্যকর করা যেতে পারে।

এই উদাহরণটি বেশ খানিকটা আলোচনার জন্ম দিয়েছে, সুতরাং এটি নিরাপদে বলা যায় যে এই উদাহরণটিকে সঠিক প্রমাণ করা সহজ নয়। তবে বেশ কয়েকটি ব্যক্তি এটি বিভিন্ন পদ্ধতি দ্বারা স্বাধীনভাবে যাচাই করেছেন। দেখুন `ডেটা PoE a = খালি | পেয়ার aa` একটি monad? অতিরিক্ত আলোচনার জন্য।

 data B a = Maybe (a, a)
   deriving Functor

 instance Applicative B where
   pure x = Just (x, x)
   b1 <*> b2 = case (b1, b2) of
     (Just (x1, y1), Just (x2, y2)) -> Just((x1, x2), (y1, y2))
     _ -> Nothing

বৈধ Monadউদাহরণ নেই তা প্রমাণ করা কিছুটা কষ্টকর । অ-monadic আচরণের কারণ হ'ল bindযখন কোনও ফাংশন f :: a -> B bফিরে আসতে পারে Nothingবা এর Justবিভিন্ন মানের জন্য বাস্তবায়নের কোনও প্রাকৃতিক উপায় নেই a

এটি বিবেচনা করা সম্ভবত স্পষ্ট Maybe (a, a, a), যা কোনও মনাডও নয় এবং এর জন্য বাস্তবায়নের চেষ্টা করা join। কেউ দেখতে পাবেন বাস্তবায়নের কোন স্বজ্ঞাত যুক্তিযুক্ত উপায় নেই join

 join :: Maybe (Maybe (a, a, a), Maybe (a, a, a), Maybe (a, a, a)) -> Maybe (a, a, a)
 join Nothing = Nothing
 join Just (Nothing, Just (x1,x2,x3), Just (y1,y2,y3)) = ???
 join Just (Just (x1,x2,x3), Nothing, Just (y1,y2,y3)) = ???
 -- etc.

দ্বারা নির্দেশিত ক্ষেত্রে ???, এটি স্পষ্ট বলে মনে হয় যে আমরা Just (z1, z2, z3)ছয়টি ভিন্ন ধরণের মানের মধ্যে কোনও যুক্তিসঙ্গত এবং প্রতিসম পদ্ধতিতে উত্পাদন করতে পারি না a। আমরা অবশ্যই এই ছয়টি মূল্যবোধের কিছু নির্বিচারে উপসেট বেছে নিতে পারি - উদাহরণস্বরূপ, সর্বদা প্রথম নজরে নেওয়া Maybe- তবে এটি মোনাডের আইনগুলিকে সন্তুষ্ট করতে পারে না। ফিরে Nothingআসা আইনগুলিও পূরণ করবে না।

  • গাছের মতো ডেটা স্ট্রাকচার যা মোনাদ নয় যদিও এর জন্য সহযোগিতা রয়েছে bind- তবে পরিচয় আইন ব্যর্থ করে।

সাধারণ গাছের মতো মোনাদ (বা "ফান্টোর-আকৃতির শাখাযুক্ত একটি গাছ") হিসাবে সংজ্ঞায়িত করা হয়

 data Tr f a = Leaf a | Branch (f (Tr f a))

এটি ফান্টারের ওপরে একটি ফ্রি মোনাদ f। তথ্যের আকারটি এমন একটি গাছ যেখানে প্রতিটি শাখা পয়েন্ট সাবট্রির একটি "ফান্টেক্টর-ফুল" is স্ট্যান্ডার্ড বাইনারি ট্রি সাথে পাওয়া যাবে type f a = (a, a)

যদি আমরা fফান্টারের আকারে পাতা তৈরি করে এই ডেটা স্ট্রাকচারটি সংশোধন করি তবে আমি যা "সিমিমোনাদ" বলি তা অর্জন করি - এতে রয়েছে bindপ্রাকৃতিকতা এবং সমিতি সংক্রান্ত আইনগুলি সন্তুষ্ট হয় তবে এর pureপদ্ধতিটি পরিচয় আইনের একটিতে ব্যর্থ হয়। "সেমিমনডস এন্ডোফান্টেক্টর বিভাগে সেমিগ্রুপস, সমস্যা কী?" এটি টাইপ ক্লাস Bind

সরলতার জন্য, আমি এর joinপরিবর্তে পদ্ধতিটি সংজ্ঞায়িত করি bind:

 data Trs f a = Leaf (f a) | Branch (f (Trs f a))
 join :: Trs f (Trs f a) -> Trs f a
 join (Leaf ftrs) = Branch ftrs
 join (Branch ftrstrs) = Branch (fmap @f join ftrstrs)

শাখা গ্রাফটিং মানসম্মত, তবে পাতাগুলি কলমটি মানক নয় এবং একটি উত্পাদন করে Branch। এটি সাহচর্যতা আইনের জন্য কোনও সমস্যা নয় তবে একটি পরিচয় আইন ভঙ্গ করে।

বহুবর্ষীয় ধরণের কখন মোনাদ উদাহরণ রয়েছে?

উভয়ই ফান্টেক্টর Maybe (a, a)এবং Maybe (a, a, a)একটি আইনী Monadউদাহরণ দেওয়া যাবে না যদিও তারা স্পষ্টতই Applicative

এই ফান্টেক্টরগুলির কোনও কৌশল নেই - না Voidবা bottomকোথাও নেই, কোনও জটিল অলসতা / কঠোরতা নেই, অসীম কাঠামো নেই, এবং কোনও ধরণের শ্রেণির বাধা নেই। Applicativeউদাহরণ হিসেবে বলা যায় সম্পূর্ণরূপে মান। ফাংশনগুলি returnএবং bindএই ফান্ট্যাক্টারের জন্য প্রয়োগ করা যেতে পারে তবে মোনডের আইনগুলি সন্তুষ্ট করবে না। অন্য কথায়, এই ফান্টেক্টরগুলি মনড নয় কারণ একটি নির্দিষ্ট কাঠামো অনুপস্থিত (তবে ঠিক কী অনুপস্থিত তা বোঝা সহজ নয়)। উদাহরণস্বরূপ, ফান্টারের একটি ছোট পরিবর্তন এটিকে একটি মোনাদে পরিণত করতে পারে: data Maybe a = Nothing | Just aএটি একটি মনাড। অনুরূপ আর এক ফান্টেক্টর data P12 a = Either a (a, a)হ'ল একটি মনাদ।

বহুবর্ষীয় স্নাদের জন্য নির্মাণ

সাধারণভাবে, এখানে এমন কিছু নির্মাণ রয়েছে যা Monadবৈধভাবে বহিরাগত ধরণের বৈধতা তৈরি করে produce এই সমস্ত নির্মাণে, Mএকটি মনাদ:

  1. type M a = Either c (w, a)যেখানে wকোন একরকম
  2. type M a = m (Either c (w, a))যেখানে mকোনও মোনাদ এবং wকোনও শঙ্কিত
  3. type M a = (m1 a, m2 a)কোথায় m1এবং m2কোন monads হয়
  4. type M a = Either a (m a)mকোন monad যেখানে

প্রথম নির্মাণ হয় WriterT w (Either c), দ্বিতীয় নির্মাণ হয় WriterT w (EitherT c m)। তৃতীয় নির্মাণ monads একটি কম্পোনেন্ট ভিত্তিক পণ্য: pure @Mএর উপাদান-অনুযায়ী পণ্য হিসাবে সংজ্ঞায়িত করা হয় pure @m1এবং pure @m2, এবং join @Mক্রস পণ্য ডেটা বাদ (যেমন দ্বারা সংজ্ঞায়িত করা হয় m1 (m1 a, m2 a)ম্যাপ করা হয় m1 (m1 a)tuple দ্বিতীয় ভাগে বাদ দ্বারা):

 join :: (m1 (m1 a, m2 a), m2 (m1 a, m2 a)) -> (m1 a, m2 a)
 join (m1x, m2x) = (join @m1 (fmap fst m1x), join @m2 (fmap snd m2x))

চতুর্থ নির্মাণ হিসাবে সংজ্ঞায়িত করা হয়

 data M m a = Either a (m a)
 instance Monad m => Monad M m where
    pure x = Left x
    join :: Either (M m a) (m (M m a)) -> M m a
    join (Left mma) = mma
    join (Right me) = Right $ join @m $ fmap @m squash me where
      squash :: M m a -> m a
      squash (Left x) = pure @m x
      squash (Right ma) = ma

আমি দেখেছি যে চারটি নির্মাণই আইনসম্মত স্নাতক উত্পাদন করে।

আমি অনুমান করি যে বহুবর্ষীয় মনাদের জন্য অন্য কোনও নির্মাণ নেই। উদাহরণস্বরূপ, ফ্যান্টেক্টর Maybe (Either (a, a) (a, a, a, a))এইগুলির মধ্যে কোনও নির্মাণের মাধ্যমে প্রাপ্ত হয় না এবং তাই মোনাডিকও নয়। যাইহোক, Either (a, a) (a, a, a)কারণ এটি তিন monads এর পণ্যে isomorphic হয় পরমাণুসদৃশ্য হয় a, aএবং Maybe a। এছাড়াও, Either (a,a) (a,a,a,a)কারণ এটি পণ্যে isomorphic হয় পরমাণুসদৃশ্য হয় aএবং Either a (a, a, a)

উপরোক্ত চারটি নির্মাণ আমাদের aউদাহরণস্বরূপ Either (Either (a, a) (a, a, a, a)) (a, a, a, a, a))এবং এর জন্য যে কোনও সংখ্যক পণ্যগুলির যে কোনও সংখ্যার যোগফল পেতে সহায়তা করবে products এই ধরণের সমস্ত নির্মাণকারীদের (কমপক্ষে একটির) Monadউদাহরণ থাকতে হবে।

এটি এখনও অবধি দেখতে পাওয়া যায় যে এই জাতীয় স্নাতকদের জন্য কী কী ব্যবহারের ক্ষেত্রে উপস্থিত থাকতে পারে। আরেকটি সমস্যা হ'ল Monadনির্মাণের মাধ্যমে 1-4 থেকে প্রাপ্ত দৃষ্টান্তগুলি সাধারণভাবে অনন্য নয়। উদাহরণস্বরূপ, টাইপ কনস্ট্রাক্টরকে দুটি উপায়ে type F a = Either a (a, a)একটি Monadউদাহরণ দেওয়া যেতে পারে : মোনাড ব্যবহার করে 4 নির্মাণ করে এবং 3 নির্মাণের মাধ্যমে আইসোমরফিজম (a, a)ব্যবহার করে Either a (a, a) = (a, Maybe a)। আবার, এই বাস্তবায়নগুলির জন্য ব্যবহারের মামলাগুলি খুঁজে পাওয়া তাত্ক্ষণিকভাবে সুস্পষ্ট নয়।

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


আমি মনে করি B হয় একটি একসংখ্যা। আপনি কি এই প্রতিবন্ধকে একটি পাল্টা উদাহরণ দিতে পারেন Pair x y >>= f = case (f x, f y) of (Pair x' _,Pair _ y') -> Pair x' y' ; _ -> Empty?
ফ্রাঙ্কি

@Franky Associativity এই সংজ্ঞা যখন আপনি আপনার পছন্দের ব্যক্তিদের সাথে ব্যর্থ fযেমন যে f xহয় Emptyকিন্তু f yএকটি হল Pair, এবং পরবর্তী ধাপে উপর উভয় Pair। আমি হাতে হাতে দেখেছি যে আইনগুলি এই বাস্তবায়ন বা অন্য কোনও প্রয়োগের জন্য রাখে না। তবে এটি করা মোটামুটি কাজ। আমি আশা করি এটি নির্ধারণ করার আরও সহজ উপায় ছিল!
winitzki

1
@Turion যুক্তি প্রযোজ্য নয় যে Maybeকারণ Maybeবিভিন্ন মান ধারণ করে না aচিন্তা সম্পর্কে।
ড্যানিয়েল ওয়াগনার

1
@ টিউরিয়ন আমি কয়েক পৃষ্ঠার গণনা দ্বারা এটি প্রমাণ করেছি; "প্রাকৃতিক উপায়" সম্পর্কে তর্কটি কেবল একটি তাত্পর্যপূর্ণ ব্যাখ্যা। একটি Monadউদাহরণে কার্যাদি থাকে returnএবং bindএটি আইনকে সন্তুষ্ট করে। দুটি প্রকারের returnবাস্তবায়ন এবং 25 টি bindপ্রয়োজনীয় প্রযোজ্য এর বাস্তবায়ন । আপনি প্রত্যক্ষ গণনা দ্বারা দেখাতে পারেন যে বাস্তবায়নের কোনওটিই আইন সন্তুষ্ট করে না। প্রয়োজনীয় কাজের পরিমাণ হ্রাস করার জন্য, আমি প্রথমে পরিচয় আইনগুলির joinপরিবর্তে bindএবং ব্যবহার করেছি। তবে এটি কাজ একটি মোটামুটি বিট হয়েছে।
উইনিটস্কি

1
@ ডুপ্লোড নো, আমার মনে Traversableহয় না এটির দরকার আছে। m (Either a (m a))ব্যবহার pure @mকরে রুপান্তরিত হয় m (Either (m a) (m a))। তারপরে তুচ্ছভাবে Either (m a) (m a) -> m aএবং আমরা ব্যবহার করতে পারি join @m। এটাই ছিল বাস্তবায়ন, যার জন্য আমি আইনগুলি পরীক্ষা করেছিলাম।
winitzki
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.