Por que estes não são equivalentes?
show $ if someCondition then someInt else some double
e
if someCondition then show someInt else show someDouble
Entendo que se você isolar a if ... else
parte no primeiro exemplo de uma expressão por si só, não poderá representar seu tipo com um tipo de soma anônima Int | Double
, como algo que você poderia fazer facilmente no TypeScript (mencionando o TypeScript porque é o langauge que eu costumava usar e que suporta tipos Sum), e teria que recorrer ao uso dos Either
dados que seriam chamados show
.
O exemplo que dei aqui é trivial, mas para mim faz mais sentido pensar "Ok, vamos mostrar algo, e que algo depende someCondition
", em vez de "Ok, se algumaCondição for verdadeira, mostrar someInt caso contrário mostrar someDouble" e também permitir para menos duplicação de código (aqui o programa é repetido duas vezes, mas também pode ser uma aplicação de função longa e, em vez de uma if ... else
, pode haver> 2 ramificações a serem consideradas)
Na minha opinião, deve ser fácil para o compilador verificar se cada um dos tipos que compõem o tipo de soma (aqui Int | Double
) pode ser usado como parâmetro para show
funcionar e decide se os tipos estão corretos ou não. Melhor ainda é que a show
função sempre retorna a string
qualquer que seja o tipo de parâmetro, portanto o compilador não precisa carregar todos os "desvios" possíveis (portanto, todos os tipos possíveis).
É por opção que esse recurso não existe? Ou está implementando mais difícil do que eu acho?
making all conversions explicit
. Na minha pergunta, não quero que Haskell faça uma conversão Int
para a Double
ou vice-versa. Eu apenas usei esses dois tipos como exemplo. Você pode substituir todos Int
por a
e Double
com b
na minha pergunta, onde ambos os tipos derivam Show
. Entendo que não existe anonymous sum types
em Haskell, mas gostaria de saber por que esse é o caso e o que está nos impedindo de projetar a linguagem para tê-la.
x :: Int | Bool
e precisamos compilar show x
, não há uma maneira fácil de saber qual ponteiro usar para chamar show
em um RTS baseado em apagamento de tipo. Provavelmente precisaríamos manter algumas informações de nível de tipo em tempo de execução.
(String, Int)
não é anônimo. É apenas um tipo de produto comum com sintaxe engraçada. (String | Int)
seria muito diferente. Comece perguntando se (Int|Int)
deve ser idêntico Int
e por quê.
if ... then ... else ...
, precisa ter o mesmo tipo na partethen
eelse
. Você pode vê-lo como um operador ternário em algumas linguagens de programação.