Pourquoi ne sont-ils pas équivalents?
show $ if someCondition then someInt else some double
et
if someCondition then show someInt else show someDouble
Je comprends que si vous isolez la if ... else
partie dans le premier exemple d'une expression par elle-même, vous ne pouvez pas représenter son type avec un type de somme anonyme, le genre de Int | Double
, comme quelque chose que vous pourriez faire facilement dans TypeScript (en mentionnant TypeScript parce que c'est le langauge que j'utilisais souvent et qui prend en charge les types Sum), et devrait recourir à l'utilisation des Either
données basées sur ce qu'il appellerait show
.
L'exemple que j'ai donné ici est trivial mais pour moi, il est plus logique de penser "D'accord, nous allons montrer quelque chose, et que quelque chose dépend de someCondition
" plutôt que "D'accord si une certaine condition est vraie, puis affichez une pour moins de duplication de code (ici, le spectacle est répété deux fois, mais cela pourrait aussi être une application de fonction longue et au lieu d'un, if ... else
il pourrait y avoir> 2 branches à considérer)
Dans mon esprit, il devrait être facile pour le compilateur de vérifier si chacun des types qui font le type sum (ici Int | Double
) pourrait être utilisé comme paramètre pour show
fonctionner et décider si les types sont corrects ou non. Encore mieux, cette show
fonction retourne toujours quelque string
soit le type des paramètres, donc le compilateur n'a pas à transporter avec lui toutes les "branches" possibles (donc tous les types possibles).
Est-ce par choix qu'une telle fonctionnalité n'existe pas? Ou est-ce plus difficile à mettre en œuvre que je pense?
making all conversions explicit
. Dans ma question, je ne veux pas que Haskell jette un Int
à un Double
ou vice versa. Je viens d'utiliser ces deux types comme exemple. Vous pouvez remplacer chaque Int
avec a
et Double
avec b
dans ma question où les deux types dérivent Show
. Je comprends qu'il n'y en a pas anonymous sum types
à Haskell, mais j'aimerais savoir pourquoi c'est le cas et ce qui nous empêche de concevoir le langage pour l'avoir.
x :: Int | Bool
et nous devons compiler show x
, il n'y a pas de moyen facile de savoir quel pointeur vers la fonction utiliser pour appeler show
, dans un RTS basé sur l'effacement de type. Nous aurions probablement besoin de conserver certaines informations au niveau du type lors de l'exécution.
(String, Int)
n'est pas anonyme. Il s'agit simplement d'un type de produit standard avec une syntaxe amusante. (String | Int)
serait très différent. Commencez par vous demander si elle (Int|Int)
devrait être identique Int
et pourquoi.
if ... then ... else ...
, doit avoir le même type dans la partiethen
etelse
. Vous pouvez le voir comme un opérateur ternaire dans certains langages de programmation.