Ord ที่สืบทอดมาพร้อมกับข้อ จำกัด เชิงปริมาณ (forall a. Ord a => Ord (fa))


10

ด้วยข้อ จำกัด เชิงปริมาณฉันสามารถหามาใช้ได้Eq (A f)หรือไม่ อย่างไรก็ตามเมื่อฉันพยายามหา Ord (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)'

PS ฉันยังมีการตรวจสอบข้อเสนอ GHC 0109-ปริมาณ- ใช้ ghc 8.6.5

คำตอบ:


8

ปัญหาคือว่าEqเป็น superclass ของOrdและข้อ จำกัด(forall a. Ord a => Ord (f a))ไม่ได้นำมาซึ่งข้อ จำกัด superclass 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)กันมาก คุณรู้ไหมว่าทำไมมีความแตกต่าง?
William Rusnack

1
ไม่ได้หมายความว่าforall a. Eq a => Eq (f a)อย่างใดอย่างหนึ่ง (ดูในแง่ของตรรกะ(A /\ B) => (C /\ D)ไม่ได้หมายความA => C)
Li-ยาวเซี่ย

1
forall a. Ord a => Ord (f a)ในความเป็นจริงสิ่งที่คุณเขียนจะเทียบเท่ากับ
Li-yao Xia

ขอบคุณสำหรับคำอธิบาย!
William Rusnack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.