Sei que algumas coisas são mais fáceis / difíceis em um idioma que no outro, mas estou interessado apenas em recursos relacionados ao tipo que são possíveis em um e impossíveis / irrelevantes no outro. Para torná-lo mais específico, vamos ignorar as extensões do tipo Haskell, já que existem muitas por aí que fazem todo tipo de coisas loucas / legais.
java
haskell
type-systems
static-typing
GlenPeterson
fonte
fonte
Respostas:
("Java", conforme usado aqui, é definido como padrão Java SE 7 ; "Haskell", conforme usado aqui, é definido como padrão Haskell 2010. )
Coisas que o sistema de tipos de Java tem, mas o de Haskell não:
Coisas que o sistema de tipos de Haskell tem, mas o Java não:
EDITAR:
Exemplos de cada um dos pontos listados acima:
Exclusivo para Java (em comparação com Haskell)
Polimorfismo do subtipo nominal
Informações do tipo de tempo de execução parcial
Exclusivo para Haskell (em comparação com Java)
Polimorfismo ad-hoc limitado
Polimorfismo de subtipo "baseado em restrições" (baseado em polimorfismo ad-hoc limitado)
Polimorfismo paramétrico de tipo superior
Digitação principal
É difícil dar um exemplo direto disso, mas significa que toda expressão tem exatamente um tipo maximamente geral (chamado de tipo principal ), que é considerado o tipo canônico dessa expressão. Em termos de polimorfismo de subtipo "baseado em restrição" (veja acima), o tipo principal de uma expressão é o subtipo exclusivo de todos os tipos possíveis com os quais essa expressão pode ser usada. A presença da digitação principal em Haskell (sem extensão) é o que permite inferência de tipo completa (ou seja, inferência de tipo bem-sucedida para cada expressão, sem a necessidade de nenhuma anotação de tipo). As extensões que quebram a digitação principal (das quais existem muitas) também quebram a integridade da inferência de tipo.
fonte
l
como uma única variável de letra, é MUITO difícil distinguir1
!Typeable
, mas o Haskell 2010 não o possui (talvez o Haskell 2014 o faça?).O sistema de tipos do Java não possui polimorfismo de tipo superior; O sistema de tipos de Haskell possui.
Em outras palavras: em Java, construtores de tipo podem abstrair sobre tipos, mas não sobre construtores de tipo, enquanto em Haskell, construtores de tipo podem abstrair sobre construtores de tipo, bem como tipos.
Em inglês: em Java, um genérico não pode pegar outro tipo genérico e parametrizá-lo,
enquanto em Haskell isso é bem fácil
fonte
<T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)
. A idéia aqui seria que, se alguém o chamasse,convertStringsToInts<ArrayList>
pegaria uma lista de cadeias de caracteres e retornaria uma lista de matrizes de números inteiros. E se eles usassemconvertStringsToInts<LinkedList>
, seria o mesmo com listas vinculadas.forall
seu tipo. Em Haskell, um tipoa -> b
é implicitamenteforall a. forall b. a -> b
. Com uma extensão, você pode tornar essesforall
itens explícitos e movê-los.Para complementar as outras respostas, o sistema de tipos de Haskell não possui subtipagem , enquanto as linguagens orientadas a objetos digitadas, como o Java.
fonte
Uma coisa que ninguém mencionou até agora é a inferência de tipos: um compilador Haskell geralmente pode inferir o tipo de expressões, mas você precisa informar ao compilador Java seus tipos em detalhes. Estritamente, esse é um recurso do compilador, mas o design do sistema de idiomas e tipos determina se a inferência de tipos é viável. Em particular, a inferência de tipo interage mal com o polimorfismo de subtipo de Java e a sobrecarga ad hoc. Por outro lado, os designers de Haskell se esforçam para não introduzir recursos que impactam a inferência de tipo.
Outra coisa que as pessoas parecem não ter mencionado até agora são os tipos de dados algébricos. Ou seja, a capacidade de construir tipos a partir de somas ('ou') e produtos ('e') de outros tipos. As classes Java fazem os produtos (campo ae campo b, digamos) bem. Mas eles realmente não fazem somas (campo a OU campo b, digamos). O Scala deve codificar isso como várias classes de casos, o que não é exatamente o mesmo. E, embora funcione para o Scala, é um pouco difícil dizer que o Java o possui.
Haskell também pode construir tipos de funções usando o construtor de funções, ->. Embora os métodos do Java tenham assinaturas de tipo, você não pode combiná-los.
O sistema de tipos do Java permite um tipo de modularidade que Haskell não possui. Vai demorar um pouco até que haja um OSGi para Haskell.
fonte