2010-02-12 13 views
11

Gibt es einen Weg (beliebig Weg), Einschränkungen in Typklassen zu implementieren?Gibt es eine Möglichkeit, Einschränkungen in Haskells Typklassen zu implementieren?

Als ein Beispiel von dem, worüber ich rede, angenommen, ich möchte eine Gruppe als eine Typklasse implementieren. So wäre eine Art eine Gruppe sein, wenn es drei Funktionen sind:

class Group a where 
    product :: a -> a -> a 
    inverse :: a -> a 
    identity :: a 

Aber das sind keine Funktionen, aber sie müssen durch einige Einschränkungen in Beziehung gesetzt werden. Zum Beispiel:

product a identity = a 
product a (inverse a) = identity 
inverse identity = identity 

etc ...

Gibt es eine Möglichkeit, diese Art von Einschränkung in der Definition der Klasse zu erzwingen, so dass jede Instanz automatisch erben würde? Als Beispiel sei angenommen, würde Ich mag die C2-Gruppe implementieren, definiert durch:

data C2 = E | C 

instance Group C2 where 
     identity = E 
     inverse C = C 

Diese beiden Definitionen eindeutig bestimmt C2 (die obigen Einschränkungen definieren alle möglichen Operationen - in der Tat, C2 die einzig mögliche Gruppe ist mit zwei Elemente wegen der Einschränkungen). Gibt es eine Möglichkeit, dies zum Funktionieren zu bringen?

+2

(Er, 'inverse C = C', sicher?) – dave4420

+0

yep, danke für das Bemerken –

+0

Diese Einschränkungen werden normalerweise * Gesetze * Beispiel, Monad Gesetze genannt. – mb14

Antwort

11

Gibt es eine Möglichkeit, diese Art von Einschränkung zu erzwingen?

NrLots von Menschen für sie hat gefragt, darunter den berühmten Tony Hoare, aber nichts scheint noch am Horizont. Dieses Problem wäre ein hervorragendes Diskussionsthema für die Haskell Prime Gruppe. Wenn jemand einen guten Vorschlag gemacht hat, ist es wahrscheinlich dort zu finden.

P.S. Dies ist ein wichtiges Problem!

+1

Ich bin der festen Überzeugung, dass die Überprüfung der Kompilierzeit auf die Erfüllung solcher Einschränkungen haltbar ist. Kannst du etwas Licht in diese Angelegenheit bringen? – fishlips

+1

@fishlips: Ich wäre schockiert, wenn ein Compiler alles selbst überprüfen könnte, ob eine Implementierung solche Einschränkungen erfüllt, aber ich kann nicht behaupten, die Literatur zum Umschreiben von Begriffen gut genug zu kennen, um sicher zu sein, einen Beweis zu schreiben. Ich vermute jedoch, dass bei einer möglichen Implementierung, wenn ein Programmierer zum * compile * -Zeit überprüft werden will, er oder sie einen maschinenüberprüfbaren Beweis liefern muss! –

+0

Humm ... das ist traurig zu hören. Gibt es eine andere Sprache, die diese Art von Constraint-Prüfung durchführen kann? Ein Problem, das ich gerne lösen würde, ist genau ein Programm zu machen, das alle möglichen Instanzen findet, die einige algebraische Einschränkungen wie in diesem Fall haben (d. H. Alle möglichen Gruppen der Ordnung n finden). Ich habe gehört, Prolog kann so etwas tun, aber ich hätte lieber eine funktionale Sprache. –

5

Typklassen können Definitionen und Deklarationen enthalten. Beispiel:

class Equality a where 
    (?=), (!=) :: a -> a -> Bool 

    a ?= b = not (a != b) 
    a != b = not (a ?= b) 

instance Eq a => Equality a where 
    (?=) = (==) 

test = (1 != 2) 

Sie auch spezielle Einschränkungen angeben können im Klar Haskell (die ihnen Gesetze lassen nennen), aber es ist nicht garantiert, dass der Compiler sie benutzen werden. Ein allgemeines Beispiel sind

8

In einigen Fällen können Sie die Eigenschaften mit QuickCheck festlegen. Dies ist keine exakte Durchsetzung, aber Sie können generische Tests bereitstellen, die alle Instanzen bestehen sollten. Zum Beispiel mit Eq könnte man sagen:

Natürlich ist es immer noch an den Instanzautor, diesen Test aufzurufen.

Dies für die Monad-Gesetze tun wäre interessant.

Verwandte Themen