1,736 research outputs found
The generic HASKELL user's guide : version 0.99 - Amber release
Software development often consists of designing datatypes around which functionality is
added. Some functionality is datatype specific, whereas other functionality is defined on
almost all datatypes in such a way that it depends only on the structure of the datatype.
A function that works on many datatypes in this way is called a generic (or polytypic)
function. Examples of generic functionality include storing a value in a database, editing
a value, comparing two values for equality, and pretty-printing a value.
Since datatypes often change and new datatypes are introduced, we have developed
Generic HASKELL which supports generic definitions to save the programmer from
(re)writing instances of generic functions. Generic HASKELL extends the functional
programming language Haskell [5] with, among other things, a construct for defining
type-indexed values with kind-indexed types, based on recent work by Hinze [2]. These
values can be specialised to all Haskell datatypes, facilitating wider application of generic
programming than provided by earlier systems such as PolyP [4]
Reasoning about modular datatypes with Mendler induction
In functional programming, datatypes a la carte provide a convenient modular
representation of recursive datatypes, based on their initial algebra
semantics. Unfortunately it is highly challenging to implement this technique
in proof assistants that are based on type theory, like Coq. The reason is that
it involves type definitions, such as those of type-level fixpoint operators,
that are not strictly positive. The known work-around of impredicative
encodings is problematic, insofar as it impedes conventional inductive
reasoning. Weak induction principles can be used instead, but they considerably
complicate proofs.
This paper proposes a novel and simpler technique to reason inductively about
impredicative encodings, based on Mendler-style induction. This technique
involves dispensing with dependent induction, ensuring that datatypes can be
lifted to predicates and relying on relational formulations. A case study on
proving subject reduction for structural operational semantics illustrates that
the approach enables modular proofs, and that these proofs are essentially
similar to conventional ones.Comment: In Proceedings FICS 2015, arXiv:1509.0282
Elaborating Inductive Definitions
We present an elaboration of inductive definitions down to a universe of
datatypes. The universe of datatypes is an internal presentation of strictly
positive families within type theory. By elaborating an inductive definition --
a syntactic artifact -- to its code -- its semantics -- we obtain an
internalized account of inductives inside the type theory itself: we claim that
reasoning about inductive definitions could be carried in the type theory, not
in the meta-theory as it is usually the case. Besides, we give a formal
specification of that elaboration process. It is therefore amenable to formal
reasoning too. We prove the soundness of our translation and hint at its
correctness with respect to Coq's Inductive definitions.
The practical benefits of this approach are numerous. For the type theorist,
this is a small step toward bootstrapping, ie. implementing the inductive
fragment in the type theory itself. For the programmer, this means better
support for generic programming: we shall present a lightweight deriving
mechanism, entirely definable by the programmer and therefore not requiring any
extension to the type theory.Comment: 32 pages, technical repor
RepLib: A library for derivable type classes
Some type class instances can be automatically derived from the structure of types. As a result, the Haskell language includes the deriving mechanism to automatic generates such instances for a small number of built-in type classes. In this paper, we present RepLib, a GHC library that enables a similar mechanism for arbitrary type classes. Users of RepLib can define the relationship between the structure of a datatype and the associated instance declaration by a normal Haskell functions that pattern-matches a representation types. Furthermore, operations defined in this manner are extensible-instances for specific types not defined by type structure may also be incorporated. Finally, this library also supports the definition of operations defined by parameterized types
Directed Containers as Categories
Directed containers make explicit the additional structure of those
containers whose set functor interpretation carries a comonad structure. The
data and laws of a directed container resemble those of a monoid, while the
data and laws of a directed container morphism those of a monoid morphism in
the reverse direction. With some reorganization, a directed container is the
same as a small category, but a directed container morphism is opcleavage-like.
We draw some conclusions for comonads from this observation, considering in
particular basic constructions and concepts like the opposite category and a
groupoid.Comment: In Proceedings MSFP 2016, arXiv:1604.0038
- …