¿Por qué no son equivalentes?
show $ if someCondition then someInt else some double
y
if someCondition then show someInt else show someDouble
Entiendo que si aísla la if ... else
parte en el primer ejemplo de una expresión en sí misma, entonces no puede representar su tipo con un tipo de suma anónima, el tipo de Int | Double
algo que podría hacer fácilmente en TypeScript (mencionando TypeScript porque es el tipo usé el idioma a menudo y eso admite los tipos de Suma), y tendría que recurrir al uso de los Either
datos que luego llamaría show
.
El ejemplo que di aquí es trivial, pero para mí tiene más sentido pensar "Ok, vamos a mostrar algo, y ese algo depende de someCondition
" en lugar de "Ok, si alguna condición es verdadera, entonces muestra algo, de lo contrario, muestra algo doble", y también permite para una menor duplicación de código (aquí el programa se repite dos veces, pero también podría ser una aplicación de función larga y, en lugar de una if ... else
, podría haber> 2 ramas para considerar)
En mi opinión, debería ser fácil para el compilador verificar si cada uno de los tipos que forman el tipo de suma (aquí Int | Double
) podría usarse como parámetro para show
funcionar y decide si los tipos son correctos o no. Aún mejor es que la show
función siempre devuelve un string
sin importar los tipos de parámetros, por lo que el compilador no tiene que llevar consigo todas las "ramas" posibles (por lo que todos los tipos posibles).
¿Es por elección que tal característica no existe? ¿O lo está implementando más difícil de lo que creo?
making all conversions explicit
. En mi pregunta, no quiero que Haskell emita Int
a un Double
viceversa. Acabo de usar esos dos tipos como ejemplo. Podrías reemplazar cada Int
con a
y Double
con b
en mi pregunta de dónde derivan ambos tipos Show
. Entiendo que no hay anonymous sum types
en Haskell, pero me gustaría saber por qué ese es el caso y qué nos impide diseñar el lenguaje para tenerlo.
x :: Int | Bool
y tenemos que compilar show x
, no hay una manera fácil de saber qué puntero a función usar para llamar show
, en un RTS basado en borrado de tipo. Probablemente necesitemos mantener información de nivel de tipo en tiempo de ejecución.
(String, Int)
No es anónimo. Es solo un tipo de producto normal con una sintaxis divertida. (String | Int)
Sería muy diferente. Comience preguntándose si (Int|Int)
debería ser idéntico Int
y por qué.
if ... then ... else ...
, debe tener el mismo tipo en la partethen
yelse
. Puede verlo como un operador ternario en algunos lenguajes de programación.