About myself
I'm Dr. Gergő Érdi (Érdi Gergő in the original Hungarian order of surname first), born on 18th November, 1980 in Budapest and living here ever since.
I've finished the Veres Péter High School in 1999, and graduated with an MD at the Semmelweis University of Medicine in 2005. Since 2003, I'm also studying at the CS faculty of Eötvös Loránd University.
I am currently (since 2005) working at Intentional Software.
Latest tweet:
Loading
Efficient type-level division for Haskell
23 May 2010 (haskell programming math) (1 comment)Another approach I wanted to explore to Encsé's 9-digit problem was creating a type-level solution in Haskell. First I'll describe what that would entail, and then present a solution to one of its sub-problems: testing special cases of divisibility in a more efficient way than the naïve implementation of repeating subtractions.
Type-level programming
Basically, a type-level Haskell program is to regular Haskell programs what C++ template metaprograms are to C++ proper. Conrad Parker wrote a great introduction to type-level programming using functional dependencies in issue 6 of The Monad.Reader journal, titled Type-Level Instant Insanity. You encode values as types, and then construct an expression whose type, as inferred by the Haskell compiler, encodes the output of your computation. To actually implement the equivalent of a function, typeclasses are used.
For example, take the following (value-level) Haskell definition of length: (deliberately not using any builtin types, and using unary representation for simplicity):
module ValueLength where
data Nat = Z | S Nat
data List a = Nil | a ::: (List a)
infixr 6 :::
length :: List a -> Nat
length Nil = Z
length (x ::: xs) = S (length xs)
(note that due to technical limitations, both : and :: are reserved names in Haskell, and so we have to use ::: for our cons)
To lift this definition to the level of types, we first need a way to represent actual numbers and lists as types. This is pretty straightforward using algebraic datatypes. Since we are ultimately only going to be interested in the type of expressions and not their value, no constructors are defined.
{-# LANGUAGE EmptyDataDecls, TypeOperators,
FunctionalDependencies,
MultiParamTypeClasses, UndecidableInstances #-}
module TypeLength where
data Z
data S n
data Nil
data x ::: xs
infixr 6 :::
-- Continued below
Older entries
My software
I hack on the following free software projects in my free time. Way back, most of them were either part of the GNOME project, or were based on the GNOME platform. These days, I'm mostly just writing small programs for fun, or throw-away code relevant to some theoretical subjects I happen to get interested in in the field of functional programming.
- Guikachu: Graphical resource editor for the GNU PalmOS SDK
- Alef: A lazy functional programming language (interpreter and compiler)
- MetaFun: Compile a Haskell-like functional language into C++ template metaprograms
Smaller ones
- Collection of Elisp snippets.
- Goblin: A Python implementation of the board game Gobblet, for Windows and Unix/Linux systems.
- XSLT templates for creating your CV: This page describes in detail a simple way to generate HTML and printable versions of your resume from a single source.