Perché questi non sono equivalenti?
show $ if someCondition then someInt else some double
e
if someCondition then show someInt else show someDouble
Capisco che se si isola la if ... elseparte nel primo esempio in un'espressione da sola, non è possibile rappresentare il suo tipo con un tipo di somma anonimo, il tipo di Int | Double, come qualcosa che si potrebbe fare facilmente in TypeScript (menzionando TypeScript perché è il langauge che ho usato spesso e che supporta i tipi di somma), e dovrei ricorrere all'utilizzo dei Eitherdati che poi basandomi su di esso chiamerebbe show.
L'esempio che ho dato qui è banale, ma per me ha più senso pensare "Va bene, mostreremo qualcosa, e quel qualcosa dipende da someCondition" piuttosto che "Va bene, se alcune condizioni sono vere, quindi mostra alcune, altrimenti mostra alcune cose doppie", e permette anche per una duplicazione del codice minore (qui lo spettacolo viene ripetuto due volte ma potrebbe anche essere un'applicazione con funzione lunga e al posto di un if ... elseci potrebbero essere> 2 rami da considerare)
Nella mia mente dovrebbe essere facile per il compilatore verificare se ciascuno dei tipi che rendono il tipo di somma (qui Int | Double) possa essere usato come parametro per showfunzionare e decide se i tipi sono corretti o meno. Ancora meglio è che la showfunzione restituisce sempre stringnon importa i tipi di parametri, quindi il compilatore non deve portare con sé tutti i possibili "rami" (quindi tutti i tipi possibili).
È per scelta che una tale funzione non esiste? O è più difficile implementarlo?
making all conversions explicit. Nella mia domanda, non voglio che Haskell lanci an Inta Doubleo viceversa. Ho appena usato questi due tipi come esempio. Potresti sostituire ogni Intcon ae Doublecon bnella mia domanda da cui derivano entrambi i tipi Show. Capisco che non ci sono anonymous sum typesin Haskell ma vorrei sapere perché è così e cosa ci impedisce di progettare il linguaggio per averlo.
x :: Int | Boole dobbiamo compilare show x, non esiste un modo semplice per sapere quale puntatore a funzione utilizzare per chiamare show, in un RTS basato sulla cancellazione del tipo. Probabilmente avremmo bisogno di mantenere alcune informazioni a livello di tipo in fase di esecuzione.
(String, Int)non è anonimo. È solo un tipo di prodotto normale con sintassi divertente. (String | Int)sarebbe molto diverso. Inizia chiedendoti se (Int|Int)dovrebbe essere identico Inte perché.
if ... then ... else ..., deve avere lo stesso tipo nella partetheneelse. Puoi vederlo come un operatore ternario in alcuni linguaggi di programmazione.