Summary: | === The last decade has seen a number of approaches to datatype-generic programming: PolyP, Scrap Your Boilerplate, Derivable Type-Classes, Generic Haskell, Generics for the Masses, etc. The approaches vary in sophistication and target audience: some propose fullblown programming languages, others suggestlibraries. Most of these approaches uses a structural representation of the definition of an algebraic data type, with generic functions defined over this structural representation and automatically instantiated for data types defined in the program. In this case, instances of a generic function for different types are overloaded. SYB adopts a different approach, by defining a library of generic combinators for the traversal of values of complex data types. These generic functions can be used to define functions that operate on specific components of these complex types, avoiding the boilerplate code involved on the traversal of the structureof values of these types.This work presents a summary of the various approaches for generic programming in Haskell and compares the most relevant ones. Based on this analysis, we propose an approach for generic programming in a language similar to Haskell, but based on System CT. System CT extends the Damas-Milner type system with support for overloading, without the need for type class declarations, as inHaskell. As part of this work, a compiler for the language Haskell-CT has been implemented, by integrated system CT's front-end with the back-end of Haskell's compiler GHC. Two fundamental extensions to System CT are identified in order to provide support for generic programming: high order polymorphism and thedefinition of specialized poli rphic functions. This last extension is based on the ideia of overlapped definitions for a function. === Na última década surgiram diversas abordagens para programação genérica em Haskell: PolyP, Scrap Your Boilerplate, Derivable Type-Classes, Generic Haskell, Generics for the Masses etc. Estas abordagens variam em sofisticação e público alvo e algumas propõe extensões à linguagem de programação, enquanto outras sugerem bibliotecas.A maioria dessas abordagens utiliza uma representação para a estrutura de definição de tipos algébricos, sendo as funções genéricas definidas sobre esta representação estrutural e automaticamente instanciadas para tipos de dados definidos no programa. Nesse caso, instâncias de uma dada função genérica para diferentes tipos são definições sobrecarregadas da mesma função. SYB adota uma estratégia distinta, definindo uma biblioteca de funções genéricas que realizam travessias sobre valores de tipos de dados complexos. Tais funções genéricas podem ser usadas para definir funções que operam sobre componentes específicos de valores de tipos complexos, evitando que a definição dessas funções envolva código simples e repetitivo, responsável pela travessia de valores do tipo complexo (boilerplate code). Neste trabalho, apresentamos uma descrição sucinta dessas diversas abordagens para programação genérica, assim como uma comparação entre as abordagens mais relevantes. Com base nessa análise, propomos uma abordagem para suporte a programação genérica em uma linguagem similara Haskell, baseada no sistema de tipos CT. O sistema CT estende o sistema de Damas-Milner com suporte para sobrecarga, sem necessidade de declaração de classes de tipos, tal como em Haskell. O back-end do compilador desta linguagem foi implementado como parte deste trabalho. Além disso, foram identificadas duas extensões necessárias ao sistema CT, para prover suporte a programação genérica: polimorfismo de ordem superior e definição de funções polimórficas especializadas. Esta última extensão é baseada na idéia de definições sobrecarregadas sobrepostas para uma mesma função, que foi também implementada como parte deste trabalho.
|