Warum sind diese nicht gleichwertig?
show $ if someCondition then someInt else some double
und
if someCondition then show someInt else show someDouble
Ich verstehe, dass Sie, wenn Sie den if ... else
Teil im ersten Beispiel für sich selbst auf einen Ausdruck isolieren, seinen Typ nicht mit einem anonymen Summentyp darstellen können Int | Double
, wie Sie ihn in TypeScript leicht tun könnten (unter Erwähnung von TypeScript, weil es der ist Sprache, die ich oft verwendet habe und die Summentypen unterstützt), und müsste auf die Verwendung der Either
Daten zurückgreifen, die dann basierend darauf aufgerufen würden show
.
Das Beispiel, das ich hier gegeben habe, ist trivial, aber für mich ist es sinnvoller zu denken, "Okay, wir werden etwas zeigen, und das hängt von etwas ab someCondition
", anstatt "Okay, wenn eine Bedingung wahr ist, dann zeige someInt, sonst zeige someDouble" und erlaube es auch für weniger Code-Duplizierung (hier wird die Show zweimal wiederholt, es könnte sich aber auch um eine Langfunktionsanwendung handeln und anstelle einer if ... else
könnte> 2 zu berücksichtigende Zweige vorhanden sein)
Meiner Meinung nach sollte es für den Compiler einfach sein, zu überprüfen, ob jeder der Typen, aus denen der Summentyp besteht (hier Int | Double
), als show
Funktionsparameter verwendet werden kann, und zu entscheiden, ob die Typen korrekt sind oder nicht. Noch besser ist, dass diese show
Funktion immer a zurückgibtstring
unabhängig von den Parametertypen , sodass der Compiler nicht alle möglichen "Zweige" (also alle möglichen Typen) mit sich führen muss.
Ist es freiwillig, dass eine solche Funktion nicht existiert? Oder ist die Implementierung schwieriger als ich denke?
making all conversions explicit
. In meiner Frage möchte ich nicht, dass Haskell Int
ein Double
oder umgekehrt wirft . Ich habe diese beiden Typen nur als Beispiel verwendet. Sie könnten jedes Int
mit a
und Double
mit b
in meiner Frage ersetzen , wo beide Typen abgeleitet sind Show
. Ich verstehe, dass es anonymous sum types
in Haskell keine gibt, aber ich würde gerne wissen, warum dies der Fall ist und was uns davon abhält, die Sprache dafür zu entwerfen.
x :: Int | Bool
und wir kompilieren müssen show x
, gibt es keine einfache Möglichkeit zu wissen, welcher Zeiger auf die Funktion zum Aufrufen show
in einem auf Typlöschung basierenden RTS verwendet werden soll. Wir müssten wahrscheinlich zur Laufzeit einige Informationen auf Typebene aufbewahren.
(String, Int)
ist nicht anonym. Es ist nur ein normaler Produkttyp mit lustiger Syntax. (String | Int)
wäre ganz anders. Fragen Sie sich zunächst, ob und warum (Int|Int)
identisch sein sollte Int
.
if ... then ... else ...
, muss den gleichen Typ imthen
undelse
Teil haben. Sie können es in einigen Programmiersprachen als ternären Operator sehen.