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 ... else
parte 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 Either
dati 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 ... else
ci 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 show
funzionare e decide se i tipi sono corretti o meno. Ancora meglio è che la show
funzione restituisce sempre string
non 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 Int
a Double
o viceversa. Ho appena usato questi due tipi come esempio. Potresti sostituire ogni Int
con a
e Double
con b
nella mia domanda da cui derivano entrambi i tipi Show
. Capisco che non ci sono anonymous sum types
in Haskell ma vorrei sapere perché è così e cosa ci impedisce di progettare il linguaggio per averlo.
x :: Int | Bool
e 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 Int
e perché.
if ... then ... else ...
, deve avere lo stesso tipo nella partethen
eelse
. Puoi vederlo come un operatore ternario in alcuni linguaggi di programmazione.