Haskell-Klasse mit Instanz der polymorphen Datendefinition

julianisch

Ich habe eine Frage zur Klassendefinition mit polymorphen Datentypen. Nehmen wir an, der definierte Datentyp ist:

data BTree a = BLeaf a | BNode a (BTree a) (BTree a) deriving(Show)

Nehmen wir an, ich möchte den Wert der Wurzel des Baums abrufen, jedoch innerhalb einer Instanz einer Klasse namens Tree:

class Tree a where
             getRoot:: a -> (?)  --<- Type of Leave value as return type

und eine Instanz:

instance Tree (BTree a) where
                        getRoot BLeaf a = a
                        getRoot BNode a _ _ = a

Ich kann den Typ der Funktion nicht herausfinden (siehe Fragezeichen), da es kein a ist und die Klasse den Parameter der Instanz nicht kennt.

4castle

Lassen Sie die Typvariable in der class TreeDeklaration auf einen Typkonstruktor der Art * -> *verweisen, und dann können Sie in der Typensignatur von auf den Typ der Werte des Baums verweisen getRoot.

class Tree t where
    getRoot :: t a -> a

instance Tree BTree where
    getRoot (BLeaf a)     = a
    getRoot (BNode a _ _) = a

Eine andere, etwas komplexere Lösung, die es ermöglicht, dass die Baumstruktur von Art ist, *wäre die Verwendung einer Typklasse mit mehreren Parametern zusammen mit funktionalen Abhängigkeiten .

{-# LANGUAGE FunctionalDependencies, FlexibleInstances #-}

class Tree t a | t -> a where
    getRoot :: t -> a

instance Tree (BTree a) a where
    getRoot (BLeaf a)     = a
    getRoot (BNode a _ _) = a

Oder Sie könnten eine Typenfamilie verwenden .

{-# LANGUAGE TypeFamilies #-}

class Tree t where
    type Value t
    getRoot :: t -> Value t

instance Tree (BTree a) where
    type Value (BTree a) = a
    getRoot (BLeaf a)     = a
    getRoot (BNode a _ _) = a

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Serialisierung der polymorphen Klasse mit Boost

Warum muss "forall" einen polymorphen Typ in der Datendefinition haben?

Instanz einer polymorphen Typfamilie in Haskell

SELECT INTO mit Änderung der Datendefinition der Zielspalte

Fehler: Neudefinition der polymorphen Klasse mit einem Zeiger im Konstruktor

Rückgabe der polymorphen Klasse

Liste der polymorphen Funktionen in Haskell?

Instanz der abstrakten Klasse mit verstecktem Konstruktor

Stapelüberlauffehler mit Instanz der Klasse

Haskell deklariert eine Instanz der Show-Klasse

Kompositionsfunktionen mit einem polymorphen Zwischentyp in Haskell

Python SQLAlchemy ORM: Zeile mit Instanz der Klasse aktualisieren

Instanz der Klasse Location mit gefälschten Daten

divergierende implizite Erweiterung der Ordnung der polymorphen Klasse

Generieren Sie Permutationen mit der polymorphen Methode

QListe einer polymorphen Klasse mit Copy-on-Write?

Gibt es eine Möglichkeit, die Anwendung einer polymorphen Funktion auf die Anzahl der Objekte mit unterschiedlichen Parametertypen in Haskell auszutrocknen?

Instanz der aktuellen Klasse in nodejs

Vergleichen der Instanz einer Klasse

C # - Instanz der Klasse finden

Warum kann ich keine öffentliche Methode einer Java-Klasse mit einer Instanz der Klasse aufrufen?

Wie initialisiere ich die Instanzvariable der Ruby-Klasse mit einer neuen Instanz einer anderen Klasse?

Verwenden einer Instanz der abgeleiteten Klasse innerhalb der Basisklasse zum Aufrufen der Basisklassenmethode mit Daten der abgeleiteten Klasse

Instanz der Klasse als Klassenmitglied derselben Klasse

Mit der Instanz der Unterklasse kann ich nicht auf die Attribute der übergeordneten Klasse zugreifen

Warum übernimmt die Listenvariable mit dem Namen node in der Klasse die Ausgabe der vorherigen Instanz der Klasse?

Die Instanzfunktion der Klasse (Funktion aus der neuen Instanz der Klasse) in nodejs kann mit jest nicht nachgeahmt werden

Entwerfen einer polymorphen Klasse

Mehrfachkontext der Haskell-Instanz

TOP Liste

heißlabel

Archiv