আবেদনকারীদের খাঁটি প্রয়োজন


19

আমি হাস্কেলের অ্যাপ্লিকেশনস শিখছি। আমার কাছে মনে হচ্ছে (আমি সম্ভবত ভুল) pureফাংশনটি সত্যই প্রয়োজন হয় না, উদাহরণস্বরূপ:

pure (+) <*> [1,2,3] <*> [3,4,5]

হিসাবে লেখা যেতে পারে

(+) <$> [1,2,3] <*> [3,4,5]

pureফাংশনটি সুস্পষ্ট ম্যাপিংয়ের মাধ্যমে যে সুবিধাটি সরবরাহ করে তা কেউ ব্যাখ্যা করতে পারেন fmap?


1
আপনি সঠিক - pure f <*> xঠিক যেমন হয় fmap f x। আমি নিশ্চিত যে এর pureঅন্তর্ভুক্ত হওয়ার কিছু কারণ রয়েছে Applicativeতবে আমি কেন তা সম্পূর্ণরূপে নিশ্চিত নই।
ব্র্যাড্রন

4
উত্তরের জন্য আমার কাছে সময় নেই এবং আমি নিশ্চিত নই যে এটি যাইহোক একটি ভাল বা সম্পূর্ণ করে তুলবে, তবে একটি পর্যবেক্ষণ: pureআবেদনকারী গণনার ক্ষেত্রে একজনকে "শুদ্ধ" মান ব্যবহার করার অনুমতি দেয়। আপনি যেমনটি সঠিকভাবে পর্যবেক্ষণ করেছেন ঠিক তেমনই, pure f <*> xযেমনটি f <$> xবলুন, এর মতো কোনও সমতুল্য নেই f <*> x <*> pure y <*> z। (কমপক্ষে আমি এটি মনে করি না))
রবিন জিগমন্ড

3
অন্য হিসাবে, আরও তাত্ত্বিক, ন্যায্যতা - একটি বিকল্প গঠন রয়েছে যা এটি গুরুত্বপূর্ণ Monoidশ্রেণীর সাথে ঘনিষ্ঠভাবে সম্পর্কিত - যার pureসাথে Monoidপরিচয় উপাদানটির সাথে মিল রয়েছে । (এটি পরামর্শ দেয় যে Applicativeএটি pureআকর্ষণীয় হতে পারে, যেহেতু Semigroup- যা Monoidঅগত্যা একটি পরিচয় না থাকা - এটি এখনও ব্যবহৃত হয় Act বাস্তবিকই, এখন আমি এটি সম্পর্কে চিন্তা করি, আমি মনে করি মনে করি পিওরস্ক্রিপ্টের ঠিক এমন "প্রয়োগকারী ছাড়াই pure" শ্রেণি রয়েছে, যদিও আমি ডন করি না এটি কীসের জন্য ব্যবহৃত হয়েছে তা জানেন না))
রবিন জিগমন্ড

2
@ রবিনজিগমন্ড fmap (\f' x' z' -> f' x' y z') f <*> x <*> z, আমার মনে হয়। ধারণাটি Applicative"ইন্টারচেঞ্জ" এর আইন হিসাবে নথিভুক্ত রয়েছে।
এইচটিএনডাব্লু

3
@RobinZigmond Applicativeছাড়া pureযেমন বিদ্যমান Applyথেকে semigroupoids
ডুপ্লড

উত্তর:


8

আমি এখানে আমার দক্ষতার প্রান্তে আছি, সুতরাং এটির চেয়ে বেশি এটি গ্রহণ করবেন না, তবে মন্তব্যের জন্য এটি বেশ দীর্ঘ ছিল।

pureপ্রকার শ্রেণিতে অন্তর্ভুক্ত করার জন্য ব্যবহারিক কারণ থাকতে পারে , তবে অনেক হাস্কেল বিমূর্ততা তাত্ত্বিক ভিত্তি থেকে প্রাপ্ত, এবং আমি বিশ্বাস করি যে এটি ক্ষেত্রেও এটি Applicative। ডকুমেন্টেশন যেমন বলে, এটি একটি শক্তিশালী লক্ষ্মী মনোয়েডাল ফ্যাক্টর ( একটি বিশদ বিবরণের জন্য https://cstheory.stackexchange.com/q/12412/56098 দেখুন )। আমি যে অনুমান করা pureহিসেবে কাজ করে পরিচয় ঠিক মত, returnজন্য করে Monad(যা একটি হল endofunctors এর বিষয়শ্রেণীতে অন্তর্ভুক্ত monoid )।

বিবেচনা করুন pureএবং liftA2:

pure :: a -> f a
liftA2 :: (a -> b -> c) -> f a -> f b -> f c

আপনি যদি কিছুটা বাদ দেন তবে আপনি কল্পনা করতে সক্ষম হতে পারেন যে liftA2এটি একটি বাইনারি অপারেশন, যা ডকুমেন্টেশনেও বলেছে:

ক্রিয়ায় বাইনারি ফাংশন উত্তোলন করুন।

pureতারপরে, এটি সম্পর্কিত পরিচয়।


6
যথাযথভাবে। Applicativeবিনা pureমূল্যে একটি, এইচএম, আধাগোষ্ঠীর ফান্টেক্টর হবে mon
বাম দিকের বাইরে

20

fmapসবসময় এটি কাটা না বিশেষত, যখন আপনি ইতিমধ্যে এটি না পেয়ে pureআপনাকে পরিচয় করিয়ে দিতে f(যেখানে fরয়েছে Applicative) দেয়। একটি ভাল উদাহরণ

sequence :: Applicative f => [f a] -> f [a]

এটি "ক্রিয়াগুলি" উত্পাদনকারী মানগুলির একটি তালিকা নেয় এবং এটিকে মানগুলির তালিকা তৈরি করে একটি ক্রিয়ায় রূপান্তরিত করে। তালিকায় কোনও ক্রিয়া না থাকলে কী হয়? একমাত্র বুদ্ধিমান ফলাফল এমন ক্রিয়া যা কোনও মান দেয় না:

sequence [] = pure [] -- no way to express this with an fmap
-- for completeness
sequence ((:) x xs) = (:) <$> x <*> sequence xs

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

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