数量化された制約を使用してOrdを派生させる(すべて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-quantified-constraintsも調べました。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)。なぜ違いがあるのか​​知っていますか?
William Rusnack

1
それも意味しませんforall a. Eq a => Eq (f a)。(ロジックの観点から見ると、(A /\ B) => (C /\ D)意味するものではありませんA => C
Li-yao Xia

1
実際、あなたが書いたものはと同等forall a. Ord a => Ord (f a)です。
Li-yao Xia

説明ありがとう!
William Rusnack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.