Erstellen Sie einen Datenkonstruktor für den teilweise angewandten Typ in Haskell

8

Ist es möglich, in Haskell einen Datenkonstruktor für den partiell angewendeten Typ zu erstellen?

ghci-Sitzung:

%Vor%

Ich möchte Datenkonstruktor für den Typ T1 erstellen - ist das überhaupt möglich? Oder muss ich neue Typen verwenden, weil es nicht möglich ist, eine solche Funktion manuell zu definieren?

    
Wojciech Danilo 23.07.2013, 17:54
quelle

4 Antworten

6

Ich bin etwas verwirrt darüber, was dein Ziel ist, aber lass uns das Stück für Stück durchgehen, und vielleicht treffe ich den richtigen Punkt:

:t sagt Ihnen den Typ einer Variable ; Es macht keinen Sinn, wenn es auf einen Typ angewendet wird, da es genau das zurückgibt, was Sie übergeben haben. Beachten Sie, dass die Fehler hier angeben, dass :t eine Art von Datenwert als Parameter erwartet:

%Vor%

Sie können einen Teiltyp erstellen:

%Vor%

Sie können keinen -Datenkonstruktor für einen Teiltyp erstellen, da sie keine Daten darstellen. Welche Werte könnte ein Maybe oder Vector haben, ohne für einen Typ parametrisiert zu werden? Sie könnten geneigt sein zu denken, dass Maybe den Wert Nothing haben könnte, aber Nothing wird wie folgt eingegeben:

%Vor%

Der Schlüssel ist, dass Nothing beliebig Maybe a sein kann, aber es benötigt immer noch a , um zu wissen, dass es Nothing ist. (Es ist ungefähr so, als ob ich dir sagen würde: "Hol mir ein Glas", anstatt "hol mir ein Glas von allem" - du kannst nicht folgen, bis ich wenigstens meine Gedanken beendet habe).

Sie können durchaus partiell angewendete Funktionen erstellen, die einen vollständigen -Typ zurückgeben, sobald sie angewendet wurden :

%Vor%     
bfops 23.07.2013 20:07
quelle
4

GADTs können dies tun. GHCi-Sitzung:

%Vor%     
Mike Craig 23.07.2013 19:03
quelle
1

Es gibt bereits einen Konstruktor für T1 und er heißt Vector :

%Vor%     
Daniel Wagner 24.07.2013 03:38
quelle
1
%Vor%

Dies erstellt einen Typ -Konstruktor für ein Vector Int . Beachten Sie, dass hier Vector als -Typ -Konstruktor verwendet wird, da Sie ein type-Argument angeben. Sie können die Art vom Typ T1 mit :k :

abfragen %Vor%

Dies sagt Ihnen, dass T1 ein Typkonstruktor ist, der einen konkreten Typ ( * ) verwendet und einen konkreten Typ zurückgibt.

Um einen Daten -Konstruktor zu erstellen, müssen Sie einen Daten -Wert für den ersten Parameter des Konstruktors Vector Daten bereitstellen:

%Vor%

( Vector ist sowohl ein type * -Konstruktor als auch ein data -Konstruktor, weil Sie den gleichen Namen links und rechts von% verwendet haben co_de% deklaration.)

    
Code-Apprentice 24.07.2013 19:15
quelle