6

constructive-algebraパッケージを使用すると、代数モジュールのインスタンスを定義できます(ベクトル空間に似ていますが、フィールドが必要なリングを使用します)。

これはモジュールを定義する私の試みです:

{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-}
module A where
import Algebra.Structures.Module
import Algebra.Structures.CommutativeRing
import Algebra.Structures.Group

newtype A = A [(Integer,String)]

instance Group A where
    (A a) <+> (A b) = A $ a ++ b
    zero = A []
    neg (A a) = A $ [((-k),c) | (k,c) <-  a]


instance Module Integer A where
    r *> (A as) = A [(r <*> k,c) | (k,c) <- as]

次の方法で失敗します。

A.hs:15:10:
    Overlapping instances for Group A
      arising from the superclasses of an instance declaration
    Matching instances:
      instance Ring a => Group a -- Defined in Algebra.Structures.Group
      instance Group A -- Defined at A.hs:9:10-16
    In the instance declaration for `Module Integer A'

A.hs:15:10:
    No instance for (Ring A)
      arising from the superclasses of an instance declaration
    Possible fix: add an instance declaration for (Ring A)
    In the instance declaration for `Module Integer A'
Failed, modules loaded: none.

Groupインスタンスをコメントアウトすると、次のようになります。

A.hs:16:10:
    No instance for (Ring A)
      arising from the superclasses of an instance declaration
    Possible fix: add an instance declaration for (Ring A)
    In the instance declaration for `Module Integer A'
Failed, modules loaded: none.

私はこれを、意味をなさず、クラス定義で必要とされないRing Ato haveのインスタンスが必要であると読みました。Module Integer A

class (CommutativeRing r, AbelianGroup m) => Module r m where
  -- | Scalar multiplication.
  (*>) :: r -> m -> m

これについて説明していただけますか?

4

2 に答える 2

5

パッケージには

instance Ring a => Group a where ...

インスタンス ヘッドaはすべての型式に一致するため、他の型式を持つインスタンスはすべて重複します。その重複は、そのようなインスタンスが実際にどこかで使用されている場合にのみエラーを引き起こします。モジュールでは、インスタンスを使用します

instance Module Integer A where
    r *> (A as) = A [(r <*> k,c) | (k,c) <- as]

Moduleクラスには、パラメーターAbelianGroup¹に制約がありmます。Groupそれは制約を意味します。したがって、このインスタンスでは、 のGroupインスタンスをA検索する必要があります。コンパイラは、2 つの一致するインスタンスを見つけます。

これが最初に報告されたエラーです。

AbelianGroup次は、コンパイラが のインスタンスを見つけようとするためですA。その時点でコンパイラが知っている唯一のインスタンスは

instance (Group a, Ring a) => AbelianGroup a

を見つけようとしますinstance Ring A where ...が、もちろんありません。

をコメントアウトする代わりにinstance Group A where ...

instance AbelianGroup a

(嘘だとしても、現時点ではコンパイルさせたいだけです) また、プラグマに追加OverlappingInstancesします。
{-# LANGUAGE #-}

ではOverlappingInstances、最も具体的な一致するインスタンスが選択されるため、ここで必要なことを実行します。

¹ ところで、 yourAは のインスタンスではなく、当然のことながら、リストAbelianGroup内で順序が関係ない場合を除き、インスタンスになることはできません。[(Integer,String)]

于 2012-05-10T16:06:21.247 に答える
2

このタイプは、不快な言語拡張なしでチェックします。

{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-}
module A where
import Algebra.Structures.Module
import Algebra.Structures.CommutativeRing
import Algebra.Structures.Group

newtype A = A [(Integer,String)]

instance Ring A where 
  A xs <+> A ys = A (xs ++ ys)
  neg (A a) = A $ [((-k),c) | (k,c) <-  a]
  A x <*> A y = A [b | a <- x, b <- y ]
  one = A []
  zero = A []

instance Module Integer A where
     r *> (A as) = A [(r <*> k,c) | (k,c) <- as] 

と が とで独立して定義され<+> <*>ているのは少し混乱し ます。それらは完全に別個のシンボルですが、すべてを作成する一般的なインスタンスにまとめられるため、 が定義されている場合は、すでに話されているため、定義してはなりません。型クラスシステムの仕組みによって、これが作者に強制されているかどうかはわかりません。 というか必要です。基本的に名前を変更するだけです; これ以上定義する必要はありません。これは、Haskell の可換性のチェック不可能なアサーションにあなたをコミットすることになっています。したがって、モジュールを作成する前に、いわば「法則を証明する」必要があります。negRingGroupRings GroupsRingGroupModuleRingCommutativeRingCommutativeRingRingCommutativeRingModule実例。ただし、これらの法則はクイックチェックの命題で表現されているため、クイックチェックを実行してこのタイプpropMulCommに特化する必要があることに注意してください。propCommutativeRing

1 と 0 についてどうすればよいかわかりませんが、次のような適切な構造を使用することで、順序に関するポイントを乗り越えることができます。

 import qualified Data.Set as S

 newtype B = B {getBs :: S.Set (Integer,String) }

しかし、newtyped を使用すると、たとえばEqA を再定義して意味を理解することもできると思います。実際、クイックチェック命題を実行する必要があります。


編集: これは、QuickCheck http://hpaste.org/68351に必要な資料が追加されたバージョンで、さまざまな Eq インスタンスの "Failed" および "OK" クイックチェック ステートメントと一緒です。このパッケージは、私にはかなり合理的に思えます。Ring と CommutativeRing ビジネスが必要ない場合は、Module を再定義する必要があると思います。彼は「可換ケースのみを考慮し、代わりに左右のモジュールを実装することは可能だろう」と言っているからです。そうしないと、quickcheck を使用できなくなります。これは明らかにパッケージの主要なポイントであり、何が起こっているかを確認した今、彼は信じられないほど簡単に実行できるようにしました。A はまさに、彼があらゆる種類のクイックチェックを使用して排除しようとしているものであり、この種のケースでだますのは非常に困難です。

于 2012-05-10T17:01:04.217 に答える