পরিমাণযুক্ত সীমাবদ্ধতার সাথে ডেরিভ অর্ড (ফোরাল এ। অর্ডার এ => অর্ড (ফা))


10

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

> newtype A f = A (f Int)
> deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f)
> deriving instance (forall a. Ord a => Ord (f a)) => Ord (A f)
<interactive>:3:1: error:
     Could not deduce (Ord a)
        arising from the superclasses of an instance declaration
      from the context: forall a. Ord a => Ord (f a)
        bound by the instance declaration at <interactive>:3:1-61
      or from: Eq a bound by a quantified context at <interactive>:1:1
      Possible fix: add (Ord a) to the context of a quantified context
     In the instance declaration for 'Ord (A f)'

পুনশ্চ. আমি 0109-পরিমাণযুক্ত-সীমাবদ্ধতার সাথে জিওসি প্রস্তাবগুলিও পরীক্ষা করে দেখেছি । Ghc 8.6.5 ব্যবহার করা হচ্ছে

উত্তর:


8

সমস্যাটি হ'ল এটি Eqএকটি সুপারক্লাস Ord, এবং সীমাবদ্ধতা (forall a. Ord a => Ord (f a))এমন একটি সুপারক্লাস বাধা দেয় না Eq (A f)যা Ord (A f)দৃষ্টান্তটি ঘোষণার জন্য প্রয়োজনীয় ।

  • আমাদের আছে (forall a. Ord a => Ord (f a))

  • আমাদের দরকার Eq (A f), (forall a. Eq a => Eq (f a))যা আমাদের যা আছে তা দ্বারা বোঝানো হয় না।

সমাধান: অ্যাড (forall a. Eq a => Eq (f a))করার Ordউদাহরণ হিসেবে বলা যায়।

(জিএইচসি প্রদত্ত ত্রুটি বার্তাটি কীভাবে সমস্যার সাথে সম্পর্কিত তা আমি আসলে বুঝতে পারি না))

{-# LANGUAGE QuantifiedConstraints, StandaloneDeriving, UndecidableInstances, FlexibleContexts #-}

newtype A f = A (f Int)
deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f)
deriving instance (forall a. Eq a => Eq (f a), forall a. Ord a => Ord (f a)) => Ord (A f)

বা আরও কিছুটা পরিপাটি করে:

{-# LANGUAGE ConstraintKinds, RankNTypes, KindSignatures, QuantifiedConstraints, StandaloneDeriving, UndecidableInstances, FlexibleContexts #-}

import Data.Kind (Constraint)

type Eq1 f = (forall a. Eq a => Eq (f a) :: Constraint)
type Ord1 f = (forall a. Ord a => Ord (f a) :: Constraint)  -- I also wanted to put Eq1 in here but was getting some impredicativity errors...

-----

newtype A f = A (f Int)
deriving instance Eq1 f => Eq (A f)
deriving instance (Eq1 f, Ord1 f) => Ord (A f)

আমি খুব কাছাকাছি ছিল deriving instance (forall a. (Eq a, Ord a) => (Eq (f a), Ord (f a))) => Ord (A f)। তুমি জানো কেন পার্থক্য আছে?
উইলিয়াম রুসনাক

1
এটিও বোঝায় forall a. Eq a => Eq (f a)না। (যুক্তির দিক দিয়ে দেখা (A /\ B) => (C /\ D)বোঝায় না A => C)
লি-ইয়াও জিয়া

1
আসলে আপনি যা লিখেছেন তা সমান forall a. Ord a => Ord (f a)
লি-ইয়াও জিয়া 12

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