সমস্ত স্থির আকারের ধারকগুলি কি শক্ত মোডোডিয়াল ফান্টেক্টর এবং / অথবা বিপরীত?


9

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:

  • Identity
  • VoidF
  • (->) r
  • Monoid m => (,) m (উত্তরগুলো দেখ)
  • Vec (n :: Nat)
  • Stream (অসীম)

এবং এখানে এমন কয়েকটি Applicativeগুলি রয়েছে যার জন্য আমরা পারি না:

  • []
  • Either e
  • Maybe
  • NonEmptyList

এখানে নিদর্শনটি বোঝায় যে StrongApplicativeক্লাসটি এক অর্থে FixedSizeবর্গ, যেখানে "নির্দিষ্ট আকার" * এর অর্থ হল বাসিন্দাদের সংখ্যাবৃদ্ধি **a কোনও বাসিন্দারf a স্থির।

এটি দুটি অনুমান হিসাবে বলা যেতে পারে:

  • প্রতি Applicativeতার ধরণের আর্গুমেন্টের উপাদানগুলির একটি "নির্দিষ্ট আকার" উপস্থাপন করা উদাহরণStrongApplicative
  • StrongApplicativeএর উপস্থিতির সংখ্যা aপৃথক হতে পারে এমন কোনও উদাহরণ নেই

যে কেউ এই অনুমানগুলিকে অস্বীকার করে এমন কাউন্টারটেক্সেল উদাহরণগুলি, বা এমন কিছু যুক্তিযুক্ত যুক্তি যা তারা সত্য বা মিথ্যা কেন তা প্রমাণ করে?


* আমি বুঝতে পারি যে আমি "নির্দিষ্ট আকার" বিশেষণটি যথাযথভাবে সংজ্ঞা দিয়েছি না। দুর্ভাগ্যক্রমে কাজটি কিছুটা বিজ্ঞপ্তিযুক্ত is আমি কোনও "স্থির আকারের" ধারকটির কোনও আনুষ্ঠানিক বিবরণ জানি না, এবং একটিটি সামনে আনার চেষ্টা করছি।StrongApplicativeএখন পর্যন্ত আমার সেরা চেষ্টা।

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

বিদ্যমান আনুষ্ঠানিক সংজ্ঞা সম্পর্কে সচেতন না হয়ে, আমি আমার "স্থির আকার" শব্দটি ব্যবহারের ক্ষেত্রে স্বজ্ঞানের কাছে আবেদন করছি। তবে যদি কেউ ইতিমধ্যে কোনও ফান্টারের আকারের জন্য বিদ্যমান ফর্মালিজম সম্পর্কে জানেন এবং StrongApplicativeএটির সাথে তুলনা করতে পারেন, তবে আরও ভাল।

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

এ সম্পর্কে সুনির্দিষ্ট না হওয়াতে মন্তব্যে কিছু বিভ্রান্তির সৃষ্টি হয়েছে, তাই বিভিন্ন ফান্টারের আকার / গুণকে আমি কী বিবেচনা করব তার কয়েকটি উদাহরণ এখানে:

  • VoidF: স্থির, 0
  • Identity: স্থির, ২
  • Maybe: পরিবর্তনশীল, সর্বনিম্ন 0, সর্বোচ্চ 1
  • []: পরিবর্তনশীল, সর্বনিম্ন 0, সর্বোচ্চ অসীম
  • NonEmptyList: পরিবর্তনশীল, সর্বনিম্ন 1, সর্বোচ্চ অসীম
  • Stream: স্থির, অসীম
  • Monoid m => (,) m: স্থির, ২
  • data Pair a = Pair a a: স্থির, 2
  • Either x: পরিবর্তনশীল, সর্বনিম্ন 0, সর্বোচ্চ 1
  • data Strange a = L a | R a: স্থির, ২

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
স্যামুয়েল লিউ

"স্থির আকার" এর একটি সম্ভাব্য সংজ্ঞাটি হ'ল "উপস্থাপনযোগ্য"। সমস্ত উপস্থাপক ফান্টেক্টরগুলি এখানে বর্ণিত অর্থে শক্তিশালী প্রয়োগকারী, কারণ (->) rএটি এবং তারা সেটির সঠিক উপায়ে isomorphic।
ড্যানিয়েল ওয়াগনার

@ ড্যানিয়েল ওয়াগনার আমার মনে হয় আপনার শক্তিশালী প্রয়োগকারীর উত্তরাধিকারী হওয়ার জন্য আপনার কেবলমাত্র একটি আইসমোরফিজমের চেয়ে বেশি প্রয়োজন (->) r; শক্তিশালী প্রয়োগমূলক কাঠামো সংরক্ষণ করার জন্য আপনার আইসোমরফিজমের উপাদানগুলির প্রয়োজন। কিছু কারণে Representableহাস্কেলের টাইপক্লাসে একটি রহস্যজনক tabulate . return = returnআইন রয়েছে (যা প্রকৃতপক্ষে নন মোনডিক ফান্টেক্টরদের জন্যও বোঝায় না) তবে এটি আমাদের বলার জন্য প্রয়োজনীয় শর্তগুলির 1/4 দেয় tabulateএবং zipএটি একটি উপযুক্ত শ্রেণীর মনোইডগুলির রূপবিজ্ঞান are । অন্য 3 টি অতিরিক্ত আইন যা আপনার কাছে দাবি করতে হবে।
আসাদ সাইদুদ্দিন

দুঃখিত, এটি হওয়া উচিত " tabulateএবং indexএটি একটি উপযুক্ত বিভাগের
রূপসমূহ

@ আসাদ সাaদুদ্দীন ডক্সে আইনটি যেভাবে বর্ণিত হয়েছে তা সম্ভবত অদ্ভুতভাবে সুনির্দিষ্ট, তবে এটি প্রমাণিত হয় যে returnকোনও গুরুতর সমস্যা নয়। শর্তাবলীতে / এর ক্ষেত্রে cotraverse getConst . Constএকটি ডিফল্ট বাস্তবায়ন এবং যেহেতু পরিবেশক / উপস্থাপনযোগ্যরা নির্দিষ্ট আকার ধারণ করে, বাস্তবায়ন অনন্য। returnpureDistributive
ডুপ্লোড

উত্তর:


4
  • Applicativeতার ধরণের আর্গুমেন্টের উপাদানগুলির একটি "নির্দিষ্ট আকার" ধারককে উপস্থাপন করা প্রতিটি উদাহরণStrongApplicative
  • StrongApplicativeএর উপস্থিতির সংখ্যা aপৃথক হতে পারে এমন কোনও উদাহরণ নেই

যে কেউ এই অনুমানগুলিকে অস্বীকার করে এমন কাউন্টারটেক্সেল উদাহরণগুলি, বা এমন কিছু যুক্তিযুক্ত যুক্তি যা তারা সত্য বা মিথ্যা কেন তা প্রমাণ করে?

আমি এই প্রথম অনুমান সম্পর্কে নিশ্চিত নই এবং @ আসাদসেইদউদ্দিনের সাথে আলোচনার ভিত্তিতে এটি প্রমাণ করা সম্ভবত কঠিন হতে পারে তবে দ্বিতীয় অনুমানটি সত্য। কেন তা দেখতে, StrongApplicativeআইন বিবেচনা করুন husk . unhusk == id; যে সব জন্য, হয় x :: f (), husk (unhusk x) == x। কিন্তু মধ্যে Haskell, unhusk == const ()যাতে আইন সবার জন্য বলছে সমতূল্য x :: f (), husk () == x। তবে এর পরিবর্তে বোঝা যাচ্ছে যে এখানে কেবলমাত্র একটি পৃথক মান বিদ্যমান থাকতে পারে f (): যদি দুটি মান ছিল x, y :: f (), তবে x == husk ()এবং husk () == yতাই x == y। তবে যদি কেবলমাত্র একটি সম্ভাব্য f ()মান থাকে তবে fঅবশ্যই স্থির আকারের হতে হবে। (উদাহরণস্বরূপ data Pair a = Pair a a, প্রকারের কেবলমাত্র একটি মান রয়েছে Pair (), এই সত্তা Pair () (), তবে ধরণের একাধিক মান Maybe ()বা রয়েছে [()])) সুতরাংhusk . unhusk == idবোঝায় এটি fঅবশ্যই স্থির আকারের হতে হবে।


হুঁ। অভিনব জিএডিটি এবং স্টাফের উপস্থিতিতে "স্পষ্টতই স্পষ্ট যে" "কেবলমাত্র একটি পৃথক মানের f ()" ইঙ্গিত পাওয়া যায় "এর উপস্থিতিগুলির সংখ্যা aআলাদা হতে পারে না"
ড্যানিয়েল ওয়াগনার

@ ড্যানিয়েল ওয়াগনার এটি প্রমাণিত হয়েছে যে "সংঘটনগুলির সংখ্যা aপরিবর্তিত হতে পারে না" StrongApplicativeউদাহরণের জন্য পর্যাপ্ত শর্ত নয় ; উদাহরণস্বরূপ, data Writer w a = Writer (w,a)এর অ-পরিবর্তিত বহুগুণ রয়েছে a, তবে এটি একটি নয় StrongApplicative। অদলীয় হওয়ার জন্য আপনার আসলে ফান্টারের আকার দরকার, যা আমি বিশ্বাস করি যে f ()সিঙ্গলটন হওয়ার পরিণতি ton
ব্র্যাড্রন

আমি নিশ্চিত না যে আমি এটি কীভাবে প্রাসঙ্গিক দেখছি। উত্তরে দ্বিতীয় অনুমানের বিষয়টি নিশ্চিত করার সময় আপনি যুক্তি দিয়েছিলেন যে "শক্তিশালী প্রয়োগকারী" বোঝায় "একটি স্বতন্ত্র f ()" বোঝায় "সংঘটনগুলির সংখ্যা aপৃথক হতে পারে না"। আমি আপত্তি করছি যে এই যুক্তির শেষ ধাপটি পরিষ্কারভাবে সত্য নয়; যেমন বিবেচনা data Weird a where One :: a -> Weird a; None :: Weird Bool। প্রকারের স্বতন্ত্র মান রয়েছে Weird ()তবে বিভিন্ন কনস্ট্রাক্টরের aভিতরে বিভিন্ন ধরণের সংখ্যা রয়েছে । (এটি এখানে একটি সম্পূর্ণ পাল্টা নমুনা নয় কারণ Functorশক্ত, তবে আমরা কীভাবে জানি যে এটি স্থির করা যায় না?)
ড্যানিয়েল ওয়াগনার

@ ড্যানিয়েল ওয়াগনার ভালো পয়েন্ট যা Weird ()একটি সিঙ্গলটন তবে এটি নির্দিষ্ট আকারের নয়। তবে Weirdএটি একটি নয় Functor, সুতরাং এটি StrongApplicativeকোনওভাবেই হতে পারে না। আমি অনুমান প্রাসঙ্গিক অনুমান হবে: যদি fএকটি হয় Functor, নেই f ()একটি Singleton যে পরোক্ষভাবে হচ্ছে fফিক্সড আকৃতি হয় ? আমি দৃ strongly়ভাবে এটি সত্য বলে সন্দেহ করি, তবে আপনি যেমন উল্লেখ করেছেন যে আমার কাছে এখনও কোনও প্রমাণ নেই।
ব্র্যাড্রেন

5

আমরা এই প্রশ্নের অন্তত একটি নেতিবাচক উত্তর দিতে পারি:

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

আসলে StrongApplicativeমূল প্রশ্নে একটি হালাল উদাহরণের একটি উদাহরণ ভুল। লেখক আবেদনকারী Monoid => (,) mনয় StrongApplicative, উদাহরণস্বরূপ husk $ unhusk $ ("foo", ()) == ("", ()) /= ("foo", ())

একইভাবে, একটি নির্দিষ্ট আকারের ধারকটির উদাহরণ:

data Strange a = L a | R a

স্থির বহুগুণ 1 এর একটি শক্তিশালী প্রয়োগকারী নয়, কারণ যদি আমরা husk = Leftতখন সংজ্ঞায়িত করি husk $ unhusk $ Right () /= Right ()এবং এর বিপরীতে। এটি দেখার একটি সমতুল উপায় হ'ল এটি আপনার লেখার মনোয়েডের জন্য লেখক কেবল আবেদনকারী Bool

সুতরাং সেখানে "স্থির আকার" প্রয়োগকারী রয়েছে যা নেই StrongApplicative। সমস্ত StrongApplicativeগুলি স্থির আকারের কিনা তা দেখতে বাকি রয়েছে।


5

আসুন "স্থির আকারের ধারক" এর আমাদের সংজ্ঞা হিসাবে উপস্থাপনযোগ্য ফান্ট্যাকার গ্রহণ করি:

class Representable f where
    type Rep f
    tabulate :: (Rep f -> a) -> f a
    index :: f a -> Rep f -> a

বাস্তব Representableকয়েক আইন এবং superclasses আছে, কিন্তু এই উত্তর উদ্দেশ্য পূরণকল্পে, আমরা আসলে মাত্র দুই বৈশিষ্ট্য প্রয়োজন:

tabulate . index = id
index . tabulate = id

(ঠিক আছে, আমাদেরও আইন মেনে instance StrongApplicative ((->) r)চলা দরকার Easy সহজ প্যাসি, আপনি ইতিমধ্যে এটির সাথে সম্মত হন))

আমরা যদি সেই সংজ্ঞাটি গ্রহণ করি তবে আমি অনুমান 1:

Applicativeতার ধরণের আর্গুমেন্টের উপাদানগুলির একটি "স্থির আকার" ধারককে উপস্থাপন করা প্রতিটি হ'ল একটি [আইন মেনে চলা] উদাহরণStrongApplicative

সত্য. এখানে কীভাবে:

instance Representable f => Applicative f where
    zip (fa, fb) = tabulate (zip (index fa, index fb))
    husk = tabulate . husk

instance Representable f => OpApplicative f where
    unzip fab = let (fa, fb) = unzip (index fab) in (tabulate fa, tabulate fb)
    unhusk = unhusk . index

instance Representable f => StrongApplicative f

প্রমাণ করার জন্য প্রচুর আইন রয়েছে, তবে আমি যুক্ত করব কেবলমাত্র বিগ ফোরের দিকে মনোনিবেশ করব StrongApplicative- আপনি সম্ভবত ইতিমধ্যে নেতৃত্বগুলি বিশ্বাস করেন Applicativeএবং OpApplicativeতবে আপনি যদি তা না করেন তবে তাদের প্রমাণগুলি নীচের বিধিগুলির মতো দেখতে ( যা একে অপরের মত দেখতে বেশ কিছুটা)) স্বচ্ছতা জন্য, আমি ব্যবহার করবে zipf, huskfফাংশন উদাহরণস্বরূপ, ইত্যাদি, এবং zipr, huskrrepresentable উদাহরণস্বরূপ, ইত্যাদি, তাই আপনি ট্র্যাক যার যা রাখতে পারবেন না। (এবং এটি যাচাই করা সহজ যে আমরা অনুমান হিসাবে প্রমাণ করার চেষ্টা করছি এমন জিনিসটি আমরা গ্রহণ করি না! এটি unhuskf . huskf = idপ্রমাণ করার সময় ব্যবহার করা ঠিক আছে unhuskr . huskr = idতবে unhuskr . huskr = idএকই প্রমাণ হিসাবে ধরে নেওয়া ভুল হবে ।)

প্রতিটি আইনের প্রমাণ মূলত একইভাবে এগিয়ে যায়: সংশোধন সংজ্ঞা, আইসোমর্ফিিজম যেটি Representableআপনাকে দেয় তা ফেলে দিন , তারপরে ক্রিয়াকলাপের জন্য অভিন্ন আইন ব্যবহার করুন।

unhuskr . huskr
= { def. of unhuskr and huskr }
(unhuskf . index) . (tabulate . huskf)
= { index . tabulate = id }
unhuskf . huskf
= { unhuskf . huskf = id }
id

huskr . unhuskr
= { def. of huskr and unhuskr }
(tabulate . huskf) . (unhuskf . index)
= { huskf . unhuskf = id }
tabulate . index
= { tabulate . index = id }
id

zipr (unzipr fab)
= { def. of unzipr }
zipr (let (fa, fb) = unzipf (index fab) in (tabulate fa, tabulate fb))
= { def. of zipr }
let (fa, fb) = unzipf (index fab) in tabulate (zipf (index (tabulate fa), index (tabulate fb)))
= { index . tabulate = id }
let (fa, fb) = unzipf (index fab) in tabulate (zipf (fa, fb))
= { def. of (fa, fb) }
tabulate (zipf (unzipf (index fab)))
= { zipf . unzipf = id }
tabulate (index fab)
= { tabulate . index = id }
fab

unzipr (zipr (fa, fb))
= { def. of zipr }
unzipr (tabulate (zipf (index fa, index fb)))
= { def. of unzipr }
let (fa', fb') = unzipf (index (tabulate (zipf (index fa, index fb))))
in (tabulate fa', tabulate fb')
= { index . tabulate = id }
let (fa', fb') = unzipf (zipf (index fa, index fb))
in (tabulate fa', tabulate fb')
= { unzipf . zipf = id }
let (fa', fb') = (index fa, index fb)
in (tabulate fa', tabulate fb')
= { def. of fa' and fb' }
(tabulate (index fa), tabulate (index fb))
= { tabulate . index = id }
(fa, fb)

বর্তমানে চিন্তা: instance StrongApplicative f => Representable f where type Rep f = forall x. f x -> xindexসহজ. আমি tabulateএখনও এর জন্য কৌশলটি কাজ করিনি, তবে মনে হচ্ছে এটি খুব কাছাকাছি ছিল।
ড্যানিয়েল ওয়াগনার

@ আসাদসেদউদ্দিনের সাথে আলোচনায়, আমি একই StrongApplicativeউদাহরণটি খুঁজে পেতে পেরেছি , তবে আইন প্রমাণ করতে পারিনি। এটি বের করার জন্য অভিনন্দন! আমি Representableযেমন উদাহরণটি দিয়েছি তেমন চেষ্টা করার চেষ্টা করেছি StrongApplicative, তবে একটি ভাল Repধরণের কথা ভাবতে পারিনি - আমি জানতে আগ্রহী হব, আপনার কীভাবে এটি forall x. f x -> xঅর্জন হয়?
ব্র্যাড্রন

@ ব্র্যাড্রন স্মরণ করুন যে অনুমানটি হ'ল এই বিষয়গুলির মধ্যে "গর্ত" একটি নির্দিষ্ট সেট রয়েছে যাতে উপাদানগুলি স্লট হয়। তারপরে টাইপের ফাংশনগুলি forall x. f x -> xহ'ল সেই ফাংশন যা কোনও গর্ত চয়ন করে এবং সেই গর্তটিতে মান ফেরত দেয়। (এবং কীভাবে বাস্তবায়ন করতে হবে সে সম্পর্কে চিন্তাভাবনা করার সময় tabulate, আমি এই ধরণের বিষয়ে আপত্তি জানাতে এসেছি unhusk; বিশদটির জন্য নিজেই প্রশ্নের মন্তব্য দেখুন))
ড্যানিয়েল ওয়াগনার

ধন্যবাদ @ ড্যানিয়েল ওয়াগনার! এটি সত্যিই চতুর পদ্ধতির - আমি এটি সম্পর্কে ভাবতাম না।
ব্র্যাড্রন

এটি বাস্তবায়নের চেষ্টা করার পরেও আমি মনে করি না যে আমি নিশ্চিত যে forall x. f x -> xএটি কাজ করবে Rep। আমার যুক্তিটি হ'ল, এটি ব্যবহার করে Repআপনি যে কোনও ধরণের indexজন্য লিখতে পারেন , কেবল তা নয় - তাই আমার সন্দেহ হয় যে এটি খুব সাধারণ হতে পারে। StrongApplicativeforall x. f x -> x
ব্র্যাড্রন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.