परिमाणित बाधाओं के साथ व्युत्पन्न ऑर्ड।


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)'

पुनश्च। मैंने भी ghc के प्रस्तावों की जाँच की है ० ९ २-२-मात्रा-अड़चन । 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उदाहरण।

(मुझे वास्तव में समझ नहीं आया कि GHC द्वारा दिया गया त्रुटि संदेश समस्या से कैसे संबंधित है।)

{-# 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)
ली-याओ ज़िया

स्पष्टीकरण के लिए धन्यवाद!
विलियम रुसनैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.