ApplicativeTypeclass প্রতিনিধিত্ব করে শিথিল monoidal functors যে টাইপ করা ফাংশন শ্রেণীতে কার্টিজিয়ান monoidal গঠন সংরক্ষণ।
অন্য কথায়, ক্যানোনিকাল আইসোমর্ফিজমগুলি দেওয়া সাক্ষ্য দেয় যা (,)একটি একঘেয়ে কাঠামো গঠন করে:
-- Implementations left to the motivated reader
assoc_fwd :: ((a, b), c) -> (a, (b, c))
assoc_bwd :: (a, (b, c)) -> ((a, b), c)
lunit_fwd :: ((), a) -> a
lunit_bwd :: a -> ((), a)
runit_fwd :: (a, ()) -> a
runit_bwd :: a -> (a, ())
টাইপক্লাস এবং তার আইনগুলি সমানভাবে এইভাবে লেখা যেতে পারে:
class Functor f => Applicative f
where
zip :: (f a, f b) -> f (a, b)
husk :: () -> f ()
-- Laws:
-- assoc_fwd >>> bimap id zip >>> zip
-- =
-- bimap zip id >>> zip >>> fmap assoc_fwd
-- lunit_fwd
-- =
-- bimap husk id >>> zip >>> fmap lunit_fwd
-- runit_fwd
-- =
-- bimap id husk >>> zip >>> fmap runit_fwd
কেউ আশ্চর্য হতে পারে যে একই কাঠামোর সাথে সম্মতিযুক্ত ওপলাক্স মনোহর এমন ফান্টারের মতো দেখতে কী হতে পারে:
class Functor f => OpApplicative f
where
unzip :: f (a, b) -> (f a, f b)
unhusk :: f () -> ()
-- Laws:
-- assoc_bwd <<< bimap id unzip <<< unzip
-- =
-- bimap unzip id <<< unzip <<< fmap assoc_bwd
-- lunit_bwd
-- =
-- bimap unhusk id <<< unzip <<< fmap lunit_bwd
-- runit_bwd
-- =
-- bimap id unhusk <<< unzip <<< fmap runit_bwd
আমরা যদি সংজ্ঞা এবং আইনগুলির সাথে জড়িত প্রকারগুলি সম্পর্কে চিন্তা করি, হতাশাব্যঞ্জক সত্য প্রকাশিত হয়; OpApplicativeএর চেয়ে বাধা নির্দিষ্ট নয় Functor:
instance Functor f => OpApplicative f
where
unzip fab = (fst <$> fab, snd <$> fab)
unhusk = const ()
তবে, যখন প্রতিটি Applicativeফান্টর (সত্যই, কোনও Functor) তুচ্ছ OpApplicative, তবুও Applicativeশিথিলতাগুলির মধ্যে একটি সুন্দর সম্পর্ক প্রয়োজন নেইOpApplicative অনর্থকতার নেই। সুতরাং আমরা শক্তিশালী মনোয়েডাল ফ্যাক্টরগুলি কার্টেসিয়ান মনোয়েডাল স্ট্রাকচারের সন্ধান করতে পারি:
class (Applicative f, OpApplicative f) => StrongApplicative f
-- Laws:
-- unhusk . husk = id
-- husk . unhusk = id
-- zip . unzip = id
-- unzip . zip = id
উপরের প্রথম আইনটি তুচ্ছ, কারণ এই ধরণের একমাত্র বাসিন্দা () -> ()পরিচয় ফাংশন ()।
তবে, বাকি তিনটি আইন, এবং সেহেতু নিজেই সাবক্লাসটি তুচ্ছ নয় । বিশেষত, প্রত্যেকটি Applicativeএই শ্রেণীর একটি আইনী উদাহরণ নয়।
এখানে কিছু Applicativeফান্টেক্টর রয়েছে যার জন্য আমরা আইনী দৃষ্টান্তগুলি ঘোষণা করতে পারি StrongApplicative:
IdentityVoidF(->) r(উত্তরগুলো দেখ)Monoid m => (,) mVec (n :: Nat)Stream(অসীম)
এবং এখানে এমন কয়েকটি Applicativeগুলি রয়েছে যার জন্য আমরা পারি না:
[]Either eMaybeNonEmptyList
এখানে নিদর্শনটি বোঝায় যে StrongApplicativeক্লাসটি এক অর্থে FixedSizeবর্গ, যেখানে "নির্দিষ্ট আকার" * এর অর্থ হল বাসিন্দাদের সংখ্যাবৃদ্ধি **a কোনও বাসিন্দারf a স্থির।
এটি দুটি অনুমান হিসাবে বলা যেতে পারে:
- প্রতি
Applicativeতার ধরণের আর্গুমেন্টের উপাদানগুলির একটি "নির্দিষ্ট আকার" উপস্থাপন করা উদাহরণStrongApplicative StrongApplicativeএর উপস্থিতির সংখ্যাaপৃথক হতে পারে এমন কোনও উদাহরণ নেই
যে কেউ এই অনুমানগুলিকে অস্বীকার করে এমন কাউন্টারটেক্সেল উদাহরণগুলি, বা এমন কিছু যুক্তিযুক্ত যুক্তি যা তারা সত্য বা মিথ্যা কেন তা প্রমাণ করে?
* আমি বুঝতে পারি যে আমি "নির্দিষ্ট আকার" বিশেষণটি যথাযথভাবে সংজ্ঞা দিয়েছি না। দুর্ভাগ্যক্রমে কাজটি কিছুটা বিজ্ঞপ্তিযুক্ত is আমি কোনও "স্থির আকারের" ধারকটির কোনও আনুষ্ঠানিক বিবরণ জানি না, এবং একটিটি সামনে আনার চেষ্টা করছি।StrongApplicativeএখন পর্যন্ত আমার সেরা চেষ্টা।
এটি তবে এটি একটি ভাল সংজ্ঞা কিনা তা মূল্যায়ন করার জন্য, এর সাথে আমার তুলনা করার জন্য কিছু দরকার। কোনও ফান্টারের পক্ষে তার ধরণের যুক্তির বাসিন্দাদের ক্ষেত্রে একটি নির্দিষ্ট আকার বা বহুগুণতা থাকা মানে এর কিছু আনুষ্ঠানিক / অনানুষ্ঠানিক সংজ্ঞা দেওয়া, প্রশ্নটি একটি অস্তিত্বের কিনাStrongApplicative উদাহরণের নির্দিষ্টভাবে এবং পরিবর্তিত আকারের ফান্ট্যাক্টগুলিকে সুনির্দিষ্টভাবে পার্থক্য
বিদ্যমান আনুষ্ঠানিক সংজ্ঞা সম্পর্কে সচেতন না হয়ে, আমি আমার "স্থির আকার" শব্দটি ব্যবহারের ক্ষেত্রে স্বজ্ঞানের কাছে আবেদন করছি। তবে যদি কেউ ইতিমধ্যে কোনও ফান্টারের আকারের জন্য বিদ্যমান ফর্মালিজম সম্পর্কে জানেন এবং StrongApplicativeএটির সাথে তুলনা করতে পারেন, তবে আরও ভাল।
** "বহুগুণ" দ্বারা আমি ফান্টারের প্যারামিটার ধরণের স্বেচ্ছাসেবীর কোডোমাইন টাইপের কোনও বাসিন্দার মধ্যে "কতগুলি" স্বেচ্ছাসেবী উপাদান দেখা দেয় সে সম্পর্কে শিথিল অর্থে উল্লেখ করছি। এই ছাড়া নির্দিষ্ট ধরনের functor প্রয়োগ করা হয় ব্যাপারে, তাই পরামিতি ধরনের কোনো নির্দিষ্ট অধিবাসীরা ব্যাপারে ছাড়া।
এ সম্পর্কে সুনির্দিষ্ট না হওয়াতে মন্তব্যে কিছু বিভ্রান্তির সৃষ্টি হয়েছে, তাই বিভিন্ন ফান্টারের আকার / গুণকে আমি কী বিবেচনা করব তার কয়েকটি উদাহরণ এখানে:
VoidF: স্থির, 0Identity: স্থির, ২Maybe: পরিবর্তনশীল, সর্বনিম্ন 0, সর্বোচ্চ 1[]: পরিবর্তনশীল, সর্বনিম্ন 0, সর্বোচ্চ অসীমNonEmptyList: পরিবর্তনশীল, সর্বনিম্ন 1, সর্বোচ্চ অসীমStream: স্থির, অসীমMonoid m => (,) m: স্থির, ২data Pair a = Pair a a: স্থির, 2Either x: পরিবর্তনশীল, সর্বনিম্ন 0, সর্বোচ্চ 1data Strange a = L a | R a: স্থির, ২
(->) rএটি এবং তারা সেটির সঠিক উপায়ে isomorphic।
(->) r; শক্তিশালী প্রয়োগমূলক কাঠামো সংরক্ষণ করার জন্য আপনার আইসোমরফিজমের উপাদানগুলির প্রয়োজন। কিছু কারণে Representableহাস্কেলের টাইপক্লাসে একটি রহস্যজনক tabulate . return = returnআইন রয়েছে (যা প্রকৃতপক্ষে নন মোনডিক ফান্টেক্টরদের জন্যও বোঝায় না) তবে এটি আমাদের বলার জন্য প্রয়োজনীয় শর্তগুলির 1/4 দেয় tabulateএবং zipএটি একটি উপযুক্ত শ্রেণীর মনোইডগুলির রূপবিজ্ঞান are । অন্য 3 টি অতিরিক্ত আইন যা আপনার কাছে দাবি করতে হবে।
tabulateএবং indexএটি একটি উপযুক্ত বিভাগের
returnকোনও গুরুতর সমস্যা নয়। শর্তাবলীতে / এর ক্ষেত্রে cotraverse getConst . Constএকটি ডিফল্ট বাস্তবায়ন এবং যেহেতু পরিবেশক / উপস্থাপনযোগ্যরা নির্দিষ্ট আকার ধারণ করে, বাস্তবায়ন অনন্য। returnpureDistributive