8

型クラスを作成するとき、通常、その関数はいくつかのプロパティに従う必要があると想定します。したがって、それぞれの型クラスにモノイドとモナドの法則があります。しかし、結合法則のように、複数のクラスがその法則に従う場合と従わない場合があることを指定したい場合はどうなりますか?Haskellの型システムでそれを行う方法はありますか?型クラスのアイデアのためのこの種の型クラスは実際に実行可能でさえありますか?


これが代数からのやる気を起こさせる例です:

class Addition x where
    add :: x -> x -> x

class Multiplication x where
    mult :: x -> x -> x

instance Addition Int where
    add = (+)

instance Multiplication Int where
    add = (*)

ここで、Intに対する追加が結合法則で可換であることを指定したい場合は、クラスとインスタンスを作成できます。

class (Addition x) => AssociativeAddition x where
class (Addition x) => CommutativeAddition x where

instance AssociativeAddition Int where
instance CommutativeAddition Int where

しかし、すべてのクラスに対して可能なすべての組み合わせを作成する必要があるため、これは面倒です。加算が可換であるが、乗算は(行列のように)そうではない場合はどうなるので、結合法則と可換法則のクラスを作成することはできません。

私ができるようにしたいのは、次のようなことです。

class Associative x where

instance (Associative Addition, Commutative Addition) => Addition Int where
    add = (+)

instance (Commutative Multiplication) => Multiplication Int where
    mult = (*)

これはできますか?

(代数や建設代数のようなHaskellの抽象代数パッケージは、現在これを行っていないので、私は推測していません。しかし、なぜですか?)

4

1 に答える 1

10

あなたは実際にいくつかの最近のGHC拡張でこれを行うことができます:

{-# LANGUAGE ConstraintKinds, KindSignatures, MultiParamTypeClasses #-}
import GHC.Exts (Constraint)

class Addition (a :: *) where
    plus :: a -> a -> a

instance Addition Integer where
    plus = (+)

class (c a) => Commutative (a :: *) (c :: * -> Constraint) where
    op :: a -> a -> a

instance Commutative Integer Addition where
    op = plus
于 2012-07-30T21:22:28.163 に答える