Pergunta

Como explicar sistema de tipo de Scala com um especialista em Haskell? Que exemplos mostram as vantagens do Scala?

Como explicar sistema de tipo de Haskell para um praticante avançado Scala? O que pode ser feito em Haskell que não pode ser feito em Scala?

Foi útil?

Solução

Scala Para um programador Haskell:

Scala é uma linguagem rigorosa e impuro com módulos de primeira classe. Os tipos de dados são declarados como "classes" ou "traços" com diferenças sutis, e módulos ou "objetos" são valores desses tipos. Scala suporta construtores tipo tomando parâmetros de tipo universalmente quantificadas. Objetos / classes / características têm membros que consistem em valores, variáveis ??mutáveis ??e funções (chamados "métodos", ao qual o módulo é passado implicitamente como uma variável chamada this). Os módulos podem ter membros de tipo que também pode tomar parâmetros. membros de tipo são existencialmente quantificadas e parâmetros de tipo podem ser de maior kinded. Como os tipos podem ser membros de valores de primeira classe, Scala fornece um sabor de tipagem dependente chamado tipos dependentes do caminho .

funções de primeira classe também são módulos. Uma função é um módulo com um método chamado apply. Um método não é de primeira classe, mas uma sintaxe é fornecido para embrulhar um método em uma função de primeira classe. Infelizmente, um módulo requer todos os seus parâmetros de tipo até frente, portanto, uma função de primeira classe parcialmente aplicada não é permitido para ser universalmente quantificada. Mais geralmente, Scala carece completamente de um mecanismo directo de tipos de classificação mais elevada do que um, mas os módulos parametrizados nos tipos mais elevadas-kinded pode ser explorada para simular RANK-n tipos.

Em vez de classes tipo de âmbito global, Scala permite que você declarar um valor implícito de qualquer tipo. Isto inclui os tipos de função, o que proporciona a conversão implícito, e, por conseguinte, tipo de extensão. Além de conversões implícitas, extensão do tipo é fornecida pelo "estende" mecanismo que permite declarar uma relação subtipo / supertipo entre os módulos. Este mecanismo pode ser utilizado para simular tipos de dados algébricos, onde o supertipo pode ser visto como o tipo do lado da mão esquerda de uma declaração de dados, e seus subtipos como os construtores de valor no lado da mão direita. Scala tem uma extensa capacidade de correspondência de padrão usando uma correspondência padrão virtualizado com padrões de primeira classe.

suportes Scala subtipos, e este tipo de limites inferência consideravelmente. Mas a inferência de tipos tem melhorado ao longo do tempo. Inferência de tipos maior kinded é suportado. No entanto, Scala não tem qualquer sistema de tipo significativa e, portanto, não tem nenhuma inferência tipo e nenhuma unificação tipo. Se uma variável do tipo é introduzido, é de tipo * a menos que anotado de outra forma. Certos tipos, como Any (o supertipo de todos os tipos) e Nothing (um subtipo de cada tipo) são tecnicamente de todo tipo , embora eles não podem ser aplicados para digitar argumentos.

Haskell para um programador Scala:

Haskell é uma linguagem puramente funcional. Isto significa que as funções não são autorizados a ter quaisquer efeitos colaterais em tudo. Por exemplo, um programa Haskell não imprimir para a tela como tal, mas é uma função que retorna um valor do tipo de dados IO[_] que descreve uma seqüência de ações para o subsistema de IO para executar.

Considerando que Scala é rigoroso padrão e oferece "por nome" anotação para os argumentos da função não estrito, Haskell é preguiçoso por padrão usando "por necessidade" semântica, e fornece anotação para argumentos rigorosos.

Tipo de inferência em Haskell é mais completo do que em Scala, tendo inferência completa. Isto significa que tipo de anotação quase nunca é necessário.

extensões recentes ao GHC compilador permitir que recursos do sistema tipo avançadas que não têm equivalente no Scala, como Rank-n tipos, tipo de famílias, e polimorfismo tipos.

Em Haskell, um módulo é uma coleção de tipos e funções, mas os módulos não são entidades de primeira classe. Implícitos são fornecidas por classes tipo, mas estes são escopo global, uma vez declarada, e eles não podem ser passados ??explicitamente como no Scala. Mucasos ltiple de uma classe tipo para um determinado tipo são resolvidos por envolvimento com um newtype para disambiguate, enquanto que no Scala isso seria resolvido simplesmente escopo ou passando instâncias explicitamente.

Uma vez que Haskell não é "objeto-oriented", não há nenhum método / função dicotomia. Cada função é de primeira classe e cada função é curried por padrão (sem Function1, Function2, etc).

Haskell não tem nenhum mecanismo subtipo, mas classes tipo pode ter um relacionamento subclasse.

Outras dicas

Eu não acredito que alguém tem sistematicamente comparada Haskell (como exemplificado pelo sistema do tipo do GHC) com Scalas. Os principais pontos de diferença são o grau de inferência de tipos, e suporte para tipos de maior classificação. Mas um tratamento completo das diferenças seria um resultado publicável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top