Im Gegensatz zu Unit ungültig machen

8

Ich würde gern verstehen, was der Unterschied zwischen diesen beiden Programmierkonzepten ist. Die erste repräsentiert das Fehlen des Datentyps und bei der letzteren existiert der Typ, aber es gibt keine Information. Außerdem erkenne ich, dass Einheit aus funktioneller programmierungstheoretischer Grundlage stammt, aber ich kann immer noch nicht verstehen, was die Verwendbarkeit des Einheitsgrundelements ist (z. B. in einem F # -Programm).

    
Aggelos Biboudis 14.12.2009, 13:35
quelle

2 Antworten

11

Der Einheitentyp macht nur alles regelmäßiger. Sie können sich jede Funktion in F # so vorstellen, dass Sie einen einzelnen Parameter verwenden und ein einzelnes Ergebnis zurückgeben. Funktionen, die keine Parameter benötigen, nehmen "unit" als Parameter und Funktionen, die keine Ergebnisse zurückgeben, ergeben als Ergebnis "unit". Dies hat eine Vielzahl von Vorteilen; Denken Sie zum Beispiel daran, wie Sie in C # sowohl eine Reihe von "Func" -Delegenten zur Darstellung von Funktionen verschiedener Aritäten benötigen, die Werte zurückgeben, als auch eine Menge von "Action" -Delegaten, die keine Werte zurückgeben (zB Func<int,void> nicht) legal - void kann nicht auf diese Weise verwendet werden, da es nicht wirklich ein "echter" Typ ist.

Siehe auch F # -Funktionstypen: Spaß mit Tupeln und Currieren

    
Brian 14.12.2009, 13:48
quelle
8

In der funktionalen Programmierung sprechen wir normalerweise davon, Eingänge mit Ausgängen zu verknüpfen. Dies bedeutet wörtlich, dass ein Argument auf seine Rückgabewerte abgebildet wird. Aber wenn etwas im mathematischen / kategorientheoretischen Sinn eine Funktion sein soll, muss es etwas zurückgeben. Ein void -Wert stellt dar, dass eine Funktion nichts zurückgibt, was in diesen Begriffen unsinnig ist.

unit ist die funktionale Antwort auf void . Es ist im Wesentlichen ein Typ mit nur einem Wert, () . Es hat eine Reihe von Anwendungen, aber hier ist ein einfacher. Nehmen wir an, Sie hatten so etwas in einer traditionelleren imperativen Sprache:

%Vor%

Dies wendet eine bestimmte Funktion func auf jedes Element in der Liste an und erzeugt eine neue Liste von func 's Ausgabetyp. Aber was passiert, wenn Sie eine Funktion übergeben, die nur ihre Argumente ausgibt? Sie wird keinen Ausgabetyp haben. Was können Sie also für U eingeben?

In einigen Sprachen würde die Übergabe einer solchen Funktion diesen Code unterbrechen (wie in C #, wo Sie void keinem generischen Typ zuordnen können). Sie müssen auf Workarounds zurückgreifen, wie zum Beispiel eine Action<T> , die klobig werden kann.

Hier ist das Konzept von unit nützlich: Es ist ein Typ, aber einer, der nur einen einzigen Wert annehmen kann. Das vereinfacht Dinge wie Verkettung und Zusammensetzung erheblich und reduziert die Anzahl der Spezialfälle, um die Sie sich sorgen müssen, erheblich.

    
John Feminella 14.12.2009 13:48
quelle