Qual é a diferença entre construtores de valor e tuplas?

Esta escrevendo que as tuplas de Haskell são simplesmente uma sintaxe diferente para os tipos de dados algébricos. Da mesma forma, existem exemplos de como redefinir construtores de valor com tuplas.

Por exemplo, um tipo de dados Tree em Haskell pode ser escrito como

data Tree a = EmptyTree | Node a (Tree a) (Tree a)

que pode ser convertido em "forma de tupla", assim:

data Tree a = EmptyTree | Node (a, Tree a, Tree a)

Qual é a diferença entre oNode construtor de valor no primeiro exemplo e o valor realtuple no segundo exemplo? isto éNode a (Tree a) (Tree a) vs.(a, Tree a, Tree a) (além da sintaxe)?

Sob o capô, éNode a (Tree a) (Tree a) apenas uma sintaxe diferente para uma tupla de três tipos apropriados em cada posição?

Eu sei que você pode aplicar parcialmente um construtor de valor, comoNode 5 qual terá o tipo:(Node 5) :: Num a => Tree a -> Tree a -> Tree a

Você também pode aplicar parcialmente uma tupla, usando(,,) como uma função ... mas isso não sabe sobre os possíveis tipos de entradas não vinculadas, como:

Prelude> :t (,,) 5
(,,) 5 :: Num a => b -> c -> (a, b, c)

a menos que, eu acho, você declare explicitamente um tipo com::.

Além de especialidades sintáticas como essa, além deste último exemplo do escopo de tipo, existe uma diferença material entre o que realmente existe em Haskell, algo que seja "construtor de valor", em comparação com uma tupla usada para armazenar valores posicionais dos mesmos tipos. argumentos?

questionAnswers(2)

yourAnswerToTheQuestion