https://wiki.haskell.org/api.php?action=feedcontributions&user=MartijnVanSteenbergen&feedformat=atomHaskellWiki - User contributions [en]2015-10-08T23:44:29ZUser contributionsMediaWiki 1.19.14+dfsg-1https://wiki.haskell.org/ZuriHac2015ZuriHac20152015-05-29T21:03:44Z<p>MartijnVanSteenbergen: added croissants</p>
<hr />
<div>[[Image:ZuriHac2015.png|right]]<br />
<br />
----<br />
{|<br />
|When:<br />
|Friday 29th of May 2015 - Sunday 31st of May 2015<br />
|-<br />
|Where:<br />
|Google, Zurich, Switzerland<br />
|}<br />
----<br />
<br />
<big>Talks by [[File:kmett.jpg|50px]] [https://github.com/ekmett Edward Kmett] and [[File:duncan.jpg|50px]] [http://www.well-typed.com/people/duncan/ Duncan Coutts]</big><br />
<br />
'''Important:'''<br><br />
Switzerland has [http://en.wikipedia.org/wiki/AC_power_plugs_and_sockets#Swiss_SEV_1011_.28Type_J.29 its own power sockets]. We can't provide converters for everybody so make sure to bring one along. Do note that the [http://en.wikipedia.org/wiki/Europlug Europlug] will fit in a Swiss power socket.<br />
<br />
&nbsp;<br />
<br />
== About ==<br />
<br />
On the last weekend of May 2015, the [http://www.meetup.com/haskellerz Zurich Haskell Meetup group] will organize ZuriHac 2015, a three day Haskell Hackathon hosted at the Google offices.<br />
<br />
This is the fourth Haskell Hackathon in Zurich. The previous three were [[ZuriHac2014]], [[ZuriHac2013]], and [[ZuriHac2010]].<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure.<br />
<br />
This is a great opportunity to meet your fellow Haskellers in real life,<br />
find new contributors for your project, improve existing libraries and tools or<br />
even start new ones!<br />
<br />
This year, we want to have a special focus on beginners. During the whole event there will be beginners' mentors on site who you can directly approach at any time with any Haskell-related question you might have. Also, we will be having introductory talks for beginners, focusing on conveying experience that cannot simply be gathered by reading books or blog posts.<br />
<br />
== Sponsors ==<br />
<br />
[[File:Google.png|230px]]<br />
<br />
[http://www.google.com/about/jobs/locations/zurich/ Google Switzerland] hosts the Hackathon.<br />
<br />
== Venue notice ==<br />
<br />
Visitors are not allowed to take any photos in the venue. No distribution of any Google work-related information visible inside the building. Visitors should always have a visitor sticker visible. Guests can not be left unattended.<br />
<br />
== News ==<br />
<br />
;27th of May 15<br />
:the [[/BBQ|BBQ will take place on Friday 29th of May]] ('''do bring some warm clothes''')<br />
<br />
;25th of May 15<br />
:Extended [https://www.google.com/maps/d/edit?mid=zizk28jdgSYw.kTu0mNVlZpBo venue map] with some Zurich by Night suggestions<br />
<br />
;9th of April 15<br />
:Confirmed beginners' talks<br />
<br />
;26th of March 15<br />
:Edward Kmett announced his talk title<br />
<br />
;6th of March 15<br />
:Duncan Coutts confirmed as second invited speaker; swapping days with Edward.<br />
;4th of March 15<br />
:Registration is open<br />
<br />
;10th of February 15<br />
:Added wiki page<br />
<br />
== Registration ==<br />
We have reached our maximum capacity. If you want to be queued into the wait list please still fill out this form: http://goo.gl/forms/L24NgFRvCw<br />
<br />
If somebody cancels, we will fill up the seats from the wait list in first come first serve order. Please don't book anything before we have confirmed a seat for you.<br />
<br />
== Attendees ==<br />
Here is the [[/Attendees|list of participants]] who have signed up for ZuriHac 2015 and have chosen their name to be listed there.<br />
<br />
And here is the distribution of the expertise level of all of the participants:<br />
<br />
{|<br />
! Beginner !! Advanced !! Expert<br />
|-<br />
| 51 || 49 || 20<br />
|}<br />
<br />
45 participants offered to be a beginners' mentor for half a day (thank you!).<br />
<br />
== Location ==<br />
[[File:ZurichMontage.jpg|300px|right]]<br />
<br />
'''Zurich, Switzerland'''<br />
<br />
Here is a map with [https://www.google.com/maps/d/edit?mid=zizk28jdgSYw.kTu0mNVlZpBo map with all important locations].<br />
<br />
To learn more about the city, please see the [http://en.wikipedia.org/wiki/Zurich '''Wikipedia'''] and [http://wikitravel.org/en/Zurich '''Wikitravel'''] articles.<br />
<br />
See here for [http://www.zvv.ch/ public transport in the Zurich area].<br />
<br />
'''A note on day tickets:'''<br />
<br />
Day tickets in Zurich run for 24 hours and can be used on all forms of transport, bus, train, tram.<br />
<br />
If you arrive via airplane, please note that the airport is outside of the zone 10, which only covers the city of Zurich itself. Since zone 10 counts double, you will need a ticket for 3 zones then.<br />
<br />
You can buy tickets from [http://www.zvv.ch/en/tickets/automatic-ticket-machine/index.html the ticket machines].<br />
<br />
Please note that all public transit in Zürich '''is free on Sunday''' (more precisely from Sunday, May 31st, 00.00, to June 1st, 05.00) due to anniversary of ZVV.<br />
<br />
== Accommodation ==<br />
<br />
We recommend the following accommodation options:<br />
<br />
* http://www.langstars.com/en/ Youthhostel, CHF 50 per night.<br />
<br />
* https://www.airbnb.com/ Airbnb, variable.<br />
<br />
* Hotel Neufeld, http://www.hotel-neufeld.ch/.<br />
<br />
== Schedule ==<br />
{|<br />
|-<br />
! !! Friday !! Saturday !! Sunday<br />
|-<br />
| 9am || doors open || doors open; croissants available || doors open<br />
|-<br />
| 10am || opening ceremony & projects intro (*1) || ||<br />
|-<br />
| 11am || Jannis Limperg, Monads by example (*4) || Gergely Risko, Template Haskell (*4) || Johan Tibell, Performance (*4)<br />
|-<br />
| 12pm || || lunch snacks (*3) || pizza lunch (*6)<br />
|- <br />
| 1pm || Oliver Charles, Web programming (*4) || ||<br />
|-<br />
| 2pm || proper lunch (*5) || Mathieu Boespflug, Distributed programming (*4) || project summaries (*1)<br />
|-<br />
| 3pm || || ||<br />
|-<br />
| 4pm || Duncan Coutts, Better faster binary serialization || Edward Kmett, Discrimination is Wrong: Improving Productivity ||<br />
|-<br />
| 5pm || buy food and head to || ||<br />
|-<br />
| 6pm || the [[/BBQ|BBQ at the lake]] || || doors close<br />
|-<br />
| 7pm || *sizzle,sizzle* || ||<br />
|-<br />
| 8pm || *chomp* =) =) || doors close ||<br />
|}<br />
<br />
=== Notes ===<br />
(*1) If you are hosting a project, please be there to both introduce it and give a summary afterwards. Also, please add your project to the [[/Projects|projects page]].<br />
<br />
(*3) We will provide salad and sandwiches or similar snacks for you. Because of limited budget we cannot serve a real lunch meal every day. Of course you can go to a local grocery shop and bring food and drinks with you.<br />
<br />
(*4) Beginners' track; Those talks will happen in a separate area, so if you don't want to attend you won't be disturbed.<br />
<br />
(*5) On Friday we will provide a proper lunch mean.<br />
<br />
(*6) On Sunday we will provide three types of pizzas and a salad.<br />
<br />
== Talks ==<br />
<br />
The links to the slides of the talks can be found on the [https://github.com/meiersi/HaskellerZ#2015-meetups '''HaskellerZ github page'''].<br />
<br />
=== Edward Kmett ===<br />
Title: Discrimination is Wrong: Improving Productivity<br />
<br />
Abstract:<br />
This talk is a case study in library design in Haskell.<br />
<br />
Fritz Henglein has shown through a number of excellent papers how to use "discrimination" to do lots of things in O(n): Sorting many more data types than you'd expect, table joins, etc.<br />
<br />
In the process of optimizing this approach and wrapping it up in a form that can be easily consumed, we'll take a lot of detours through the different ways you can think about code when optimizing Haskell.<br />
<br />
* We'll need some category theory, from a deeper understanding of monoids to Day convolution.<br />
* We'll need to consider final and initial encodings.<br />
* We'll need to drift down to low level system concerns from building a custom foreign prim to nesting unsafePerformIO within unsafePerformIO.<br />
* We'll need properties of laziness from productivity to IVars.<br />
<br />
Along the way we'll find and fix a small problem with the initial discrimination paper, which opens the door to streaming results, rather than having to wait until all the input is ready.<br />
<br />
=== Duncan Coutts ===<br />
Title: Better faster binary serialization<br />
<br />
Abstract:<br />
<br />
This talk is a case study in low level optimization in Haskell.<br />
<br />
We have existing libraries for binary serialization but the mainstream<br />
ones use bad formats, and could always be faster. We will look at new<br />
work to improve on the existing libraries, to use a new better format,<br />
and to dramatically improve performance.<br />
<br />
We will go into the details of a number of standard and new techniques<br />
for getting a good combination of performance with features and<br />
flexibility.<br />
<br />
* High+low level approach to eliminating unnecessary allocations in deserialization<br />
* Surprising use of deep embeddings and interpreters<br />
* Moving work from compiled code to an interpreter<br />
* Rewrite rules to improve interpreted code<br />
* Deep embedding of composition to give statically allocated descriptions of branching programs<br />
* Types to safely use unsafe low level data structures<br />
* Looking at STG code to see allocations and other problems<br />
* Fast path / slow path tricks<br />
* Explicit control stacks<br />
* ABIs / calling conventions for unknown functions<br />
<br />
There'll be plenty of code, types and benchmarks.<br />
<br />
=== Jannis Limperg ===<br />
Title: Monads by example<br />
<br />
Abstract: The Monad type class is used extensively in both the Haskell standard<br />
library and numerous third-party libraries for all sorts of domains.<br />
Yet, it is also one of the most infamous roadblocks for Haskell<br />
beginners, which this talk aims to address.<br />
<br />
In order to build an intuition for what a Monad 'is' and especially for<br />
how it's useful in everyday programming, we will take a look at several<br />
important instances of the Monad class from the standard library (and<br />
the de-facto standard transformers package): Maybe, Either, [], State<br />
and IO. The examples will focus for the most part on how these very<br />
different types are all instances of the abstract concept of a Monad,<br />
and how using this abstraction and the associated syntactic sugar (do<br />
notation) can lead to cleaner, more readable code. Afterwards, we will<br />
take a look at how the Monad class is defined by a set of simple laws<br />
that every Monad instance must obey. Time permitting, we may also touch<br />
upon slightly more advanced topics such as Monad transformers and how<br />
Monads are related to Functors and Applicative Functors.<br />
<br />
Prerequisites: [http://learnyouahaskell.com/chapters LYAH] up to and including chapter 8 (or of course<br />
anything else that covers the same topics). In particular, a basic<br />
understanding of algebraic data types and type classes is essential.<br />
<br />
=== Oliver Charles ===<br />
Title: An Introduction to Web Programming<br />
<br />
Abstract: For many people, Haskell is not their first programming language - a lot of us learnt to program in other languages like Python or Java, and would like to be able to use Haskell to solve practical problems. However, what seem to be simple web applications in other languages can be daunting to even begin using Haskell. In this talk, we'll look at how to build a small web application to allow ZuriHac participants to share what they have been working on. We'll use the Spock web framework along with postgresql-simple to build a basic CRUD application, and see how we can start prototyping a simple web application within minutes.<br />
<br />
=== Gergely Risko ===<br />
Title: Template Haskell<br />
<br />
Abstract: Template Haskell is the meta programming extension for GHC. In this<br />
talk we will investigate and livecode some basic concepts of code<br />
generation and code introspection provided by this facility. We will<br />
also take a look on an example: the hflags command line parsing<br />
library.<br />
<br />
=== Mathieu Boespflug ===<br />
Title: Distributed Programming<br />
<br />
Abstract: TBD<br />
<br />
=== Johan Tibell ===<br />
Title: Performance<br />
<br />
Abstract: Production quality code not only needs to compute the correct result,<br />
but needs to do so within some given resource constraints (i.e. time<br />
and memory). We'll look at the most common optimizations you can use<br />
to make your Haskell code perform better and some rules of thumb you<br />
can use in your daily Haskell programming to avoid some performance<br />
problems "by design".<br />
<br />
== Projects ==<br />
See the [[/Projects|projects page]].<br />
<br />
== Communication ==<br />
If you have any questions before the event, please reach out to Gleb Peregud <gleber.p@gmail.com> or Alexander Bernauer <acopton@gmail.com>. If you are a confirmed participant, you will receive update emails from Gleb or Alex as well.<br />
<br />
Before the event, and in particular during the event, you can find us and other participants on irc://freenode.net/#zurihac. In addition, feel free to post on Twitter and Google+ using the hashtag '''#zurihac'''.<br />
<br />
== Organizers ==<br />
The events are organized in name of the [http://www.meetup.com/HaskellerZ/ Zurich Haskell meetup group] by the following people:<br />
<br />
* Gleb Peregud (Google)<br />
* Alexander Bernauer (Google)<br />
* Johan Tibell (Google)<br />
* Simon Meier (IBM Research)<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/ZuriHac2014/ProjectsZuriHac2014/Projects2014-05-07T11:39:16Z<p>MartijnVanSteenbergen: more explaining</p>
<hr />
<div>These are some of the projects that ZuriHac 2014 [[ZuriHac2014/Attendees|attendees]] will be working on:<br />
<br />
=aeson=<br />
<br />
See: http://hackage.haskell.org/package/aeson<br />
<br />
* Bas van Dijk. Faster JSON encoder.<br />
<br />
=scion / lambdachine=<br />
<br />
* Thomas Schilling<br />
<br />
=hakyll=<br />
<br />
See: http://jaspervdj.be/hakyll/<br />
<br />
* Jasper van der Jeugt<br />
<br />
=Haskell: the Gathering=<br />
<br />
Implementation of Magic: the Gathering in Haskell. We will work on [https://github.com/MedeaMelana/Magic the rules engine], [https://github.com/MedeaMelana/Magic/tree/master/Magic-Cards/src/Magic card implementations] (both in Haskell) and [https://github.com/q42jaap/magic-client the web client] (TypeScript/HTML). Help is welcome in all three areas.<br />
<br />
* Martijn van Steenbergen</div>MartijnVanSteenbergenhttps://wiki.haskell.org/ZuriHac2014/ProjectsZuriHac2014/Projects2014-05-07T11:36:40Z<p>MartijnVanSteenbergen: added Magic</p>
<hr />
<div>These are some of the projects that ZuriHac 2014 [[ZuriHac2014/Attendees|attendees]] will be working on:<br />
<br />
=aeson=<br />
<br />
See: http://hackage.haskell.org/package/aeson<br />
<br />
* Bas van Dijk. Faster JSON encoder.<br />
<br />
=scion / lambdachine=<br />
<br />
* Thomas Schilling<br />
<br />
=hakyll=<br />
<br />
See: http://jaspervdj.be/hakyll/<br />
<br />
* Jasper van der Jeugt<br />
<br />
=Haskell: the Gathering=<br />
<br />
Continue working on both [https://github.com/MedeaMelana/Magic the rules engine], [https://github.com/MedeaMelana/Magic/tree/master/Magic-Cards/src/Magic card implementations] and [https://github.com/q42jaap/magic-client the web client].<br />
<br />
* Martijn van Steenbergen</div>MartijnVanSteenbergenhttps://wiki.haskell.org/OdHacOdHac2013-05-21T21:10:01Z<p>MartijnVanSteenbergen: /* Photos */ formatting</p>
<hr />
<div>----<br />
{|<br />
|When:<br />
|Friday, May 3rd – Sunday, May 5th, 2013<br />
|-<br />
|Hours:<br />
|9am ~ 8pm<br />
|-<br />
|Where:<br />
|Odessa, Ukraine<br />
|}<br />
----<br />
<br />
&nbsp;<br />
<br />
== About ==<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure.<br />
<br />
This is a great opportunity to meet your fellow haskellers in real life,<br />
find new contributors for your project, improve existing libraries and tools or<br />
even start new ones!<br />
<br />
== Sponsors ==<br />
[[Image:Provectus.jpg]]<br />
<br />
[http://www.provectus-it.com/ Provectus IT] will host the Hackathon.<br />
<br />
== News ==<br />
<br />
; 2013-04-28<br />
: Added local information<br />
<br />
; 2013-03-16<br />
: Published [http://ro-che.info/odhac/attendees.html the list of attendees]<br />
<br />
; 2013-02-05<br />
: Registration is now open!<br />
<br />
== Registration ==<br />
To register please fill the [http://bit.ly/OdHacReg form]<br />
<br />
== Location ==<br />
'''Odessa, Ukraine'''<br />
<br />
To learn more about the city, please see the [http://en.wikipedia.org/wiki/Odessa '''Wikipedia'''] and [http://wikitravel.org/en/Odessa '''Wikitravel'''] articles.<br />
<br />
=== Visa information ===<br />
Citizens of most European countries do not need a visa to stay in Ukraine for less than 90 days. [http://mfa.gov.ua/en/consular-affairs/entering-ukraine/visa-requirements-for-foreigners Check here if in doubt.]<br />
<br />
Also note that a visa is typically required for work-related visits. Since you may have a hard time explaining to officials that you've come to write software ''for free'', you'd rather not mention this fact.<br />
<br />
=== Getting there ===<br />
Odessa International Airport (ODS) has daily direct connections from and to Kyiv, Vienna, Istanbul, Warsaw, Prague and Moscow.<br />
<br />
Through these it is connected to the most of Europe with just one stop.<br />
<br />
=== Getting around ===<br />
[[/HowToFind|How to find important places (venue, hotels)]]<br />
<br />
[http://bit.ly/OdHacMap Google map with important places]<br />
<br />
=== Accommodation ===<br />
Check out our [[/Accommodation|accommodation program]].<br />
<br />
You can also find a hotel yourself at the usual booking sites (e.g. [http://booking.com/ booking.com], [http://hostelworld.com/ hostelworld.com]).<br />
<br />
=== Other local information ===<br />
[[/Local|Some important information about Odessa]]<br />
<br />
A [http://ro-che.info/odhac/leaflet.pdf leaflet] with important information. Print it before you leave to Odessa.<br />
<br />
== Schedule ==<br />
<br />
The official hacking hours are 10am to 8pm on Friday, 9am to 8pm on Saturday and Sunday.<br />
<br />
Please come before '''11am on Friday'''. At 11am there will be projects introduction and discussion.<br />
<br />
=== Lunch ===<br />
<br />
We'll go out for lunch at about 2pm each day. The main choices for lunch are: <br />
<br />
; Zharyu-Paryu (Жарю-Парю) <br />
: Uspenskaya, 28 (Успенская, 28)<br />
: A canteen. Relatively cheap — you can have lunch for about 35 UAH (3 EUR).<br />
<br />
; Gallo Cafe<br />
: Troitskaya, 26 (Троицкая, 26)<br />
: A bit more expensive. You can have a set meal for 67 UAH (6 EUR) or order from the menu.<br />
<br />
=== Pub ===<br />
Every evening after hacking we go to a pub (this is completely optional, of course).<br />
<br />
=== Pre-party ===<br />
<br />
There also will be a pre-party on Thursday evening, for those of you who arrive in Odessa by Thursday.<br />
<br />
Location: Troubadour cafe (Zhukovskogo, 13) ([https://maps.google.com/maps/ms?msid=201956864525835828898.0004d2d804b85089fd35a&msa=0&ie=UTF8&ll=46.480664,30.746183&spn=0.01782,0.042272&t=m&z=15&vpsrc=1&iwloc=0004db6bb0fbd78b05d43 map])<br />
<br />
Time: 19.00<br />
<br />
== Attendees ==<br />
See the [http://ro-che.info/odhac/attendees.html list of attendees]<br />
<br />
== Projects ==<br />
See the [[/Projects|projects page]].<br />
<br />
== IRC, Twitter ==<br />
The main communication channel during the Hackathon will be our IRC channel: '''#odhac''' at Freenode.<br />
<br />
'''#odhac''' is our Twitter hashtag as well.<br />
<br />
== Artifacts ==<br />
<br />
Please add links to your photos and blog posts about OdHac here!<br />
<br />
=== Photos ===<br />
* [http://ro-che.info/tmp/OdHac.zip Roman's photos]<br />
* [http://www.flickr.com/photos/medeamelana/collections/72157633579241370/ Martijn's photos]<br />
<br />
=== Blog posts ===<br />
<br />
[http://idontgetoutmuch.wordpress.com/2013/05/05/cabal-hacking-at-odhac/ Cabal Hacking at OdHac by Dominic Steinitz]<br />
<br />
== Organizers ==<br />
[http://ro-che.info/ Roman Cheplyaka]<br />
<br />
For any questions or emergencies, you can always call Roman at +380-66-228-57-80 or send an email to roma@ro-che.info.<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/OdHacOdHac2013-05-21T21:09:39Z<p>MartijnVanSteenbergen: /* Photos */ added link to Martijn's photos</p>
<hr />
<div>----<br />
{|<br />
|When:<br />
|Friday, May 3rd – Sunday, May 5th, 2013<br />
|-<br />
|Hours:<br />
|9am ~ 8pm<br />
|-<br />
|Where:<br />
|Odessa, Ukraine<br />
|}<br />
----<br />
<br />
&nbsp;<br />
<br />
== About ==<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure.<br />
<br />
This is a great opportunity to meet your fellow haskellers in real life,<br />
find new contributors for your project, improve existing libraries and tools or<br />
even start new ones!<br />
<br />
== Sponsors ==<br />
[[Image:Provectus.jpg]]<br />
<br />
[http://www.provectus-it.com/ Provectus IT] will host the Hackathon.<br />
<br />
== News ==<br />
<br />
; 2013-04-28<br />
: Added local information<br />
<br />
; 2013-03-16<br />
: Published [http://ro-che.info/odhac/attendees.html the list of attendees]<br />
<br />
; 2013-02-05<br />
: Registration is now open!<br />
<br />
== Registration ==<br />
To register please fill the [http://bit.ly/OdHacReg form]<br />
<br />
== Location ==<br />
'''Odessa, Ukraine'''<br />
<br />
To learn more about the city, please see the [http://en.wikipedia.org/wiki/Odessa '''Wikipedia'''] and [http://wikitravel.org/en/Odessa '''Wikitravel'''] articles.<br />
<br />
=== Visa information ===<br />
Citizens of most European countries do not need a visa to stay in Ukraine for less than 90 days. [http://mfa.gov.ua/en/consular-affairs/entering-ukraine/visa-requirements-for-foreigners Check here if in doubt.]<br />
<br />
Also note that a visa is typically required for work-related visits. Since you may have a hard time explaining to officials that you've come to write software ''for free'', you'd rather not mention this fact.<br />
<br />
=== Getting there ===<br />
Odessa International Airport (ODS) has daily direct connections from and to Kyiv, Vienna, Istanbul, Warsaw, Prague and Moscow.<br />
<br />
Through these it is connected to the most of Europe with just one stop.<br />
<br />
=== Getting around ===<br />
[[/HowToFind|How to find important places (venue, hotels)]]<br />
<br />
[http://bit.ly/OdHacMap Google map with important places]<br />
<br />
=== Accommodation ===<br />
Check out our [[/Accommodation|accommodation program]].<br />
<br />
You can also find a hotel yourself at the usual booking sites (e.g. [http://booking.com/ booking.com], [http://hostelworld.com/ hostelworld.com]).<br />
<br />
=== Other local information ===<br />
[[/Local|Some important information about Odessa]]<br />
<br />
A [http://ro-che.info/odhac/leaflet.pdf leaflet] with important information. Print it before you leave to Odessa.<br />
<br />
== Schedule ==<br />
<br />
The official hacking hours are 10am to 8pm on Friday, 9am to 8pm on Saturday and Sunday.<br />
<br />
Please come before '''11am on Friday'''. At 11am there will be projects introduction and discussion.<br />
<br />
=== Lunch ===<br />
<br />
We'll go out for lunch at about 2pm each day. The main choices for lunch are: <br />
<br />
; Zharyu-Paryu (Жарю-Парю) <br />
: Uspenskaya, 28 (Успенская, 28)<br />
: A canteen. Relatively cheap — you can have lunch for about 35 UAH (3 EUR).<br />
<br />
; Gallo Cafe<br />
: Troitskaya, 26 (Троицкая, 26)<br />
: A bit more expensive. You can have a set meal for 67 UAH (6 EUR) or order from the menu.<br />
<br />
=== Pub ===<br />
Every evening after hacking we go to a pub (this is completely optional, of course).<br />
<br />
=== Pre-party ===<br />
<br />
There also will be a pre-party on Thursday evening, for those of you who arrive in Odessa by Thursday.<br />
<br />
Location: Troubadour cafe (Zhukovskogo, 13) ([https://maps.google.com/maps/ms?msid=201956864525835828898.0004d2d804b85089fd35a&msa=0&ie=UTF8&ll=46.480664,30.746183&spn=0.01782,0.042272&t=m&z=15&vpsrc=1&iwloc=0004db6bb0fbd78b05d43 map])<br />
<br />
Time: 19.00<br />
<br />
== Attendees ==<br />
See the [http://ro-che.info/odhac/attendees.html list of attendees]<br />
<br />
== Projects ==<br />
See the [[/Projects|projects page]].<br />
<br />
== IRC, Twitter ==<br />
The main communication channel during the Hackathon will be our IRC channel: '''#odhac''' at Freenode.<br />
<br />
'''#odhac''' is our Twitter hashtag as well.<br />
<br />
== Artifacts ==<br />
<br />
Please add links to your photos and blog posts about OdHac here!<br />
<br />
=== Photos ===<br />
[http://ro-che.info/tmp/OdHac.zip Roman's photos]<br />
[http://www.flickr.com/photos/medeamelana/collections/72157633579241370/ Martijn's photos]<br />
<br />
=== Blog posts ===<br />
<br />
[http://idontgetoutmuch.wordpress.com/2013/05/05/cabal-hacking-at-odhac/ Cabal Hacking at OdHac by Dominic Steinitz]<br />
<br />
== Organizers ==<br />
[http://ro-che.info/ Roman Cheplyaka]<br />
<br />
For any questions or emergencies, you can always call Roman at +380-66-228-57-80 or send an email to roma@ro-che.info.<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/DHD_UHac/AttendeesDHD UHac/Attendees2012-03-13T20:55:47Z<p>MartijnVanSteenbergen: added Martijn</p>
<hr />
<div>This is a list of attendees for [[DHD_UHac|DHD >>= UHac]].<br />
<br />
If you have [[DHD_UHac/Register|registered]], please consider adding yourself to the list. Your contact and travel information may help with coordination between participants.<br />
<br />
If you live around Utrecht or plan to commute from home each day, you may put "Local" for accommodation.<br />
<br />
{| class="wikitable"<br />
! IRC Nickname<br />
! Real Name (Affl)<br />
! Mobile #<br />
! Arrive<br />
! Depart<br />
! Accommodation<br />
|-<br />
| leather<br />
| Sean Leather (UU)<br />
| +31616158163<br />
|<br />
|<br />
| Local<br />
|-<br />
| norm2782<br />
| Jurriën Stutterheim (UU)<br />
| +31642392944<br />
|<br />
|<br />
| Local<br />
|-<br />
| ruud<br />
| Ruud Koot (UU)<br />
| +31623024223<br />
|<br />
|<br />
| Local<br />
|-<br />
| kosmikus<br />
| Andres Löh (Well-Typed LLP)<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
| sol<br />
| Simon Hengel<br />
| +4917661064074<br />
|<br />
|<br />
|<br />
|-<br />
| dreixel<br />
| José Pedro Magalhães (UU)<br />
| +31650459029<br />
|<br />
|<br />
| Local<br />
|-<br />
| marczoid<br />
| Marc van Zee (UU)<br />
| +31633610518<br />
|<br />
|<br />
| Local<br />
|-<br />
| paba<br />
| Patrick Bahr (University of Copenhagen)<br />
|<br />
|<br />
|<br />
| Local<br />
|-<br />
| toothbrush<br />
| Paul van der Walt (UU)<br />
| +31614681351<br />
|<br />
|<br />
| Local<br />
|-<br />
| spockz<br />
| Alessandro Vermeulen (UU)<br />
| +31646165747<br />
|<br />
|<br />
| Local<br />
|-<br />
| wlad<br />
| Vlad Hanciuta<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
| gcollins<br />
| Gregory Collins (Google)<br />
| +41 79 441 6832<br />
|<br />
|<br />
| Karel V Hotel<br />
|-<br />
| <br />
| Pascal Hof<br />
| <br />
|<br />
|<br />
| <br />
|-<br />
| jaspervdj<br />
| Jasper Van der Jeugt<br />
| +32 476 26 48 47<br />
|<br />
|<br />
| Yet undecided<br />
|-<br />
| cameleon<br />
| Erik Hesselink<br />
| +31 6 50 994 887<br />
|<br />
|<br />
| Local<br />
|-<br />
| sjoerd_visscher<br />
| Sjoerd Visscher<br />
| +31 6 1508 4368<br />
|<br />
|<br />
| Local<br />
|-<br />
| mklinik<br />
| Markus Klinik<br />
| +4917666101511<br />
|<br />
|<br />
|<br />
|-<br />
| <br />
| Jurriaan Hage<br />
| +31 611191976<br />
| <br />
| <br />
| Local<br />
|-<br />
| ncs<br />
| Nikos Savvidis (UU)<br />
| +31644321424<br />
|<br />
|<br />
| Local<br />
|-<br />
| <br />
| Henk-Jan van Tuyl<br />
| <br />
|<br />
|<br />
| Local (travelling from Rotterdam, DHD only)<br />
|-<br />
| sfvisser<br />
| Sebastiaan Visser<br />
| +31624828951<br />
|<br />
|<br />
| Local<br />
|-<br />
| dcoutts<br />
| Duncan Coutts (Well-Typed LLP)<br />
| <br />
|<br />
|<br />
|<br />
|-<br />
| igloo<br />
| Ian Lynagh (Well-Typed LLP)<br />
| <br />
|<br />
|<br />
|<br />
|-<br />
| cies<br />
| Cies Breijs<br />
| +31646469087<br />
|<br />
|<br />
| Local (travelling from Rotterdam)<br />
|-<br />
| <br />
| Patrick Weemeeuw<br />
| +32495590214<br />
| Friday morning<br />
| Friday evening<br />
| Traveling from Leuven (BE)<br />
|-<br />
|<br />
| Jan Bessai<br />
| <br />
| Friday<br />
| Sunday<br />
|<br />
|-<br />
|<br />
| Edsko de Vries<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
| laar<br />
| Lars Corbijn<br />
| <br />
| <br />
| <br />
| Local (travelling from Hengelo)<br />
|-<br />
| <br />
| George Fourtounis<br />
| <br />
| <br />
| <br />
| Local<br />
|-<br />
|<br />
| Victor Denisov<br />
|<br />
|<br />
|<br />
| Not Yet decided<br />
|-<br />
|<br />
| Sjoerd Timmer<br />
| +31620086456<br />
|<br />
|<br />
| Local<br />
|-<br />
| nicmo<br />
| Augusto Passalaqua<br />
| +31644079781<br />
|<br />
|<br />
| Local<br />
|-<br />
| pcapriotti<br />
| Paolo Capriotti (Well-Typed LLP)<br />
| <br />
|<br />
|<br />
|<br />
|-<br />
| <br />
| Martijn van Steenbergen<br />
| <br />
|<br />
|<br />
| Local<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/CamHac/PostHackathonReportCamHac/PostHackathonReport2011-08-16T13:11:17Z<p>MartijnVanSteenbergen: /* Error reporting for JsonGrammar */ added author name</p>
<hr />
<div>= Post-Hackathon Report =<br />
<br />
This page is for listing what was done during the Hackathon. Please add a short description of what you worked on, with links to relevant blog posts, hackage packages, commits, etc.<br />
<br />
== fclabels 1.0 release ==<br />
<br />
New release of the '''fclabels''' package. The new package has a lot of code and documentation cleanups, support for partial labels in the case of multi-constructor datatypes and is about 20x as fast for setting and modifying as the previous version. Thanks everyone for helping me out!<br />
<br />
Hackage: http://hackage.haskell.org/package/fclabels-1.0.1<br />
<br />
Github: http://github.com/sebastiaanvisser/fclabels<br />
<br />
== GHC and base library improvements ==<br />
<br />
* [http://hackage.haskell.org/trac/ghc/ticket/5413 Add primops for bit population count]. These primops compile down to `POPCNT` instructions where available and fast fallbacks (implemented in C) otherwise.<br />
<br />
* [http://hackage.haskell.org/trac/ghc/ticket/5414 Add unchecked left and right bit shifts]: The Data.Bits.shift method uses a branch to check if the shift amount is larger than the word size and returns 0 in these cases. This extra safety makes performance worse in bit twiddling code.<br />
<br />
* Discussed unpacking of enums in GHC (not yet implemented).<br />
<br />
* Discussed refactoring compiler/util/Digraph.lhs into a reusable graph combinator library, along with porting over hoopl's control-flow-graph traversals (not yet implemented).<br />
<br />
== Context synonym families ==<br />
<br />
Started working on context synonym families and indexed context synonym families. We make this work by giving evidence the new kind Fact, and then allowing any type of kind Fact to appear on the left of a => arrow.<br />
<br />
(Max Bolingbroke, Dominic Orchard and Nicolas Wu)<br />
<br />
== Darcs ==<br />
<br />
New contributors:<br />
<br />
* use red text to report when <font color="red">we have a conflict</font> ([http://bugs.darcs.net/issue1681 issue1681],[http://bugs.darcs.net/patch646 patch646], Jeff Foster)<br />
* support 'since' in English dates parser<br />
* filter SSH output ([http://bugs.darcs.net/issue845 issue845], Jeff Foster and Sebastian Korten)<br />
* support arbitrary darcs command in darcs-test (Alexander Njemz)<br />
* output ISO dates in darcs changes? ([http://bugs.darcs.net/issue140 issue140], Alexander N, may be not a good idea)<br />
* add a last regrets prompt to interactive patch selection ([http://bugs.darcs.net/issue1920 issue1920], [http://bugs.darcs.net/patch655 patch655], Johannes Weiß)<br />
* [in-progress] support removing changes in amend-record ([http://bugs.darcs.net/issue1470 issue1470], Johannes Weiß)<br />
<br />
== wxHaskell ==<br />
<br />
* a Windows build fix ([https://sourceforge.net/mailarchive/forum.php?thread_name=CAA5%3D7kb%2BCmJ178tvrxtOnuswWBeBxYpSotiQWRXuKE3m_sByXA%40mail.gmail.com&forum_name=wxhaskell-devel patch])<br />
* a fix for [https://sourceforge.net/tracker/?func=detail&aid=3019730&group_id=73133&atid=536845 an issue with colorDialog] ([https://sourceforge.net/mailarchive/forum.php?thread_name=20110813150933.GA758%40dewdrop.local&forum_name=wxhaskell-devel patch])<br />
<br />
== hCole-server ==<br />
<br />
* A Snap-based web application that interacts with the COLE (see http://portal.acm.org/citation.cfm?id=1356080 and http://portal.acm.org/citation.cfm?id=1772965) framework for exploring compiler optimisation levels. The purpose of the web app is that collaborators can submit optimisation sequences to the COLE backend and retrieve the results when they are available after measuring.<br />
* Git repository of the web application can be found at https://github.com/itkovian/hcole-server<br />
<br />
== GObject Introspection ==<br />
<br />
* Work-in-progress binding generator for GObject-based libraries such as Gtk+ 3.<br />
* Started switching to [http://hackage.haskell.org/package/haskell-src-exts-1.11.1 haskell-src-exts] for code generation.<br />
* Patches currently on the ''camhac'' branch on [https://gitorious.org/haskell-gi/haskell-gi gitorious].<br />
<br />
== Snap Framework ==<br />
<br />
* Snap 0.5.3 and 0.5.3.1 released!<br />
<br />
* Several bugs squashed or nearly-squashed: [https://github.com/snapframework/snap-core/issues/2 #2] (IPv6 support, from Vlad Hanciuta), [https://github.com/snapframework/snap-core/issues/77 #77], [https://github.com/snapframework/snap-core/issues/78 #78], and [https://github.com/snapframework/snap-core/issues/79 #79].<br />
<br />
* File upload code: replaced "openBinaryTempFile" with something less dumb (mkstemp) on unix, and fixed some iteratee cleanup problems using an MVar finalizer<br />
<br />
* Removed the template haskell code from Data.Concurrent.HashMap in snap-server<br />
<br />
* Some work has been done on the authentication Snaplet, including an (incomplete) HDBC backend for it. An early work-in-progress can be found here: https://github.com/norm2782/snap<br />
* An example application which uses Snap 0.6 has been improved to use the authentication Snaplet. Another work-in-progress: https://github.com/norm2782/snap-guestbook<br />
<br />
== Data.Text ==<br />
<br />
* Further benchmarking, bug fixing to support the UTF-8 port<br />
* Progress can be found in the ''utf8'' branch [http://github.com/jaspervdj/text here]<br />
* The [http://jaspervdj.be/files/text.html GSoC project] is basically done, next up is writing a summary report of benchmark results and what advantages and disadvantages come with the port<br />
<br />
== hs-poker ==<br />
<br />
* A "redneck naive" poker hand evaluator. Code is on github (https://github.com/fffej/HS-Poker). Hopefully intend to turn this into a poker bot playground for Haskell (Jeff / Sebastian)<br />
<br />
== haskell-mpi ==<br />
* New version 1.1.0 uploaded to hackage, including support for more MPI implementations, bugfixes and general awesomness<br />
* Upcoming Monad Reader would feature and article about parallel programming with MPI, written during the course of the hackathon (Dmitry Astapov)<br />
<br />
== HTTP ==<br />
<br />
Some work was done on setting up tests for HTTP. Additionally, some bugs were fixed, code was cleaned up, warnings removed and a start was made on improving the Network.Browser module.<br />
<br />
== EchoNest API ==<br />
<br />
A very nascent API for accessing the EchoNest Music API http://developer.echonest.com/docs/v4/index.html . Coming to a GitHub server in the near future, as soon as it stops looking so ugly (Ian Knopke / Jose Calderon).<br />
<br />
== TagSoup/Derive/HLint ==<br />
<br />
All the above packages got upgraded to the latest GHC, along with a few bug fixes (Derive now deals with singleton constructors with no fields, HLint now supports an ANSI CPP flag) (Neil Mitchell)<br />
<br />
== Hoogle ==<br />
<br />
The current Hoogle parser for user queries is old, doesn't parse everything correctly, and in particular doesn't deal well with partial queries (when the user is still typing their search). We discussed lots of edge cases, and started implementing a new version (Jacek Generowicz, with guidance from Neil Mitchell)<br />
<br />
== CmdArgs ==<br />
<br />
The CmdArgs package lets you concisely specific command line arguments. I ported the package to GHC 7.2.1, did some cleanups, and fixed some bugs (you can now use Int64 etc). I then started working on two new features: 1) Given a CmdArgs program (such as Hoogle) you can specify you want to enter the arguments via a GUI hosted in the web browser. Currently the GUI is a simple textbox with realtime validation, but in future it will become a structured command line argument editor based on the options to your tool. 2) Adding automatic bash autocompletion - some of the work has been done, but the details are not yet finished. (Neil Mitchell)<br />
<br />
== Hackage server ==<br />
<br />
Further refactoring work, simplification of HTTP basic/digest authentication code. Started work on serving package changelogs. Improvements to admin pages to make various features more discoverable (Duncan Coutts, Stefan Wehr, Ben Millwood).<br />
<br />
Hackathon branch of the code is at (not all patches have been submitted yet):<br />
<br />
darcs get http://code.haskell.org/~duncan/camhac/hackage-server/<br />
<br />
== Bittorrent DHT ==<br />
<br />
Initial work on implementing [http://www.bittorrent.org/beps/bep_0005.html BEP 0005] in Haskell. Some core data structures seem to be working (although untested) and I'm currently working on the protocol. I will probably merge this into Haskell Torrent when everything is working, but I intend to keep the library available separately as I see potential uses for the network other than Bittorrent. (Alex Horsman)<br />
<br />
https://github.com/aninhumer/haskell-dht<br />
<br />
== LambdaHack ==<br />
<br />
Discussed gameplay and hacks, annotated the code with the discussion results and finally accepted [https://github.com/kosmikus/LambdaHack/pull/11 the pull request] from [http://hackage.haskell.org/package/Allure Allure of the Stars] to [http://hackage.haskell.org/package/LambdaHack LambdaHack].<br />
<br />
== HaskelSSHClient ==<br />
<br />
Hacked around a bit on the Haskel SSH Client. Work was started on making it able to do re-keying after the initial key exchange, but it is unfinished for now... (Bart Coppens)<br />
<br />
https://github.com/bcoppens/HaskellSshClient<br />
<br />
== Haskell Test Framework (HTF) ==<br />
<br />
* New '--quiet' flag: only produces output for failing tests (FINISHED)<br />
* Output a diff if an assertEqual fails (not yet finished)<br />
<br />
== Stack traces in GHC ==<br />
<br />
I (Simon M.) was working on adding better support for source code annotations in GHC's Core language, and unifying the way we handle profiling cost centres, coverage annotations, and breakpoints in the GHCi debugger. I'm working on a new semantics for cost centre stacks, which will allow us to track call stacks at runtime. This will not only give us more accurate profiling, but also let us report stack traces on errors (e.g. head []), perhaps enabled by a compile-time option.<br />
<br />
== TLS ==<br />
<br />
lots of various misc improvements: re-work records for more type safety, support for compression, initial support of version 1.2. (Vincent Hanquez)<br />
<br />
https://github.com/vincenthz/hs-tls<br />
<br />
== Pattern Synonyms ==<br />
Simon PJ, Simon M, and I (Lennart Augustsson) hashed out a design for pattern synonyms. I've barely begun implementation, so don't expect anything just yet.<br />
<br />
http://hackage.haskell.org/trac/ghc/wiki/PatternSynonyms<br />
<br />
== Frequent Subgraph Algorithm ==<br />
I (Stephen Lavelle) implemented the vSiGraM algorithm for searching for frequent vertex-disjoint subgraphs of large graphs. Doesn't really work for large graphs, though - 'tis quite slow right now.<br />
<br />
https://github.com/increpare/vsigram<br />
<br />
== Data.ByteString.Lazy.Builder ==<br />
<br />
Duncan Coutts and Johan Tibell reviewed my (Simon Meier) work on a lazy bytestring builder for the 'bytestring' library; based on blaze-builder. The API and implementation is now complete. Documentation is there, but needs lots of polishing. I also gave a talk on when and how to use the bytestring builder. The slides and example code are available from [https://github.com/meiersi/bytestring/blob/master/bench/CSV.hs github].<br />
<br />
== Error reporting for JsonGrammar ==<br />
<br />
Some progress on better error reporting for the JSON conversion functions in the [http://hackage.haskell.org/package/JsonGrammar JsonGrammar package] was made. Now <hask>fromJson</hask> no longer says <hask>Nothing</hask> when there is an error in the input JSON. Progress can be [https://github.com/MedeaMelana/JsonGrammar/tree/errors tracked on GitHub]. When finished it will be merged back into the master branch and released in a new version on hackage. (Martijn van Steenbergen)</div>MartijnVanSteenbergenhttps://wiki.haskell.org/CamHac/PostHackathonReportCamHac/PostHackathonReport2011-08-16T13:10:44Z<p>MartijnVanSteenbergen: /* Error reporting for JsonGrammar */</p>
<hr />
<div>= Post-Hackathon Report =<br />
<br />
This page is for listing what was done during the Hackathon. Please add a short description of what you worked on, with links to relevant blog posts, hackage packages, commits, etc.<br />
<br />
== fclabels 1.0 release ==<br />
<br />
New release of the '''fclabels''' package. The new package has a lot of code and documentation cleanups, support for partial labels in the case of multi-constructor datatypes and is about 20x as fast for setting and modifying as the previous version. Thanks everyone for helping me out!<br />
<br />
Hackage: http://hackage.haskell.org/package/fclabels-1.0.1<br />
<br />
Github: http://github.com/sebastiaanvisser/fclabels<br />
<br />
== GHC and base library improvements ==<br />
<br />
* [http://hackage.haskell.org/trac/ghc/ticket/5413 Add primops for bit population count]. These primops compile down to `POPCNT` instructions where available and fast fallbacks (implemented in C) otherwise.<br />
<br />
* [http://hackage.haskell.org/trac/ghc/ticket/5414 Add unchecked left and right bit shifts]: The Data.Bits.shift method uses a branch to check if the shift amount is larger than the word size and returns 0 in these cases. This extra safety makes performance worse in bit twiddling code.<br />
<br />
* Discussed unpacking of enums in GHC (not yet implemented).<br />
<br />
* Discussed refactoring compiler/util/Digraph.lhs into a reusable graph combinator library, along with porting over hoopl's control-flow-graph traversals (not yet implemented).<br />
<br />
== Context synonym families ==<br />
<br />
Started working on context synonym families and indexed context synonym families. We make this work by giving evidence the new kind Fact, and then allowing any type of kind Fact to appear on the left of a => arrow.<br />
<br />
(Max Bolingbroke, Dominic Orchard and Nicolas Wu)<br />
<br />
== Darcs ==<br />
<br />
New contributors:<br />
<br />
* use red text to report when <font color="red">we have a conflict</font> ([http://bugs.darcs.net/issue1681 issue1681],[http://bugs.darcs.net/patch646 patch646], Jeff Foster)<br />
* support 'since' in English dates parser<br />
* filter SSH output ([http://bugs.darcs.net/issue845 issue845], Jeff Foster and Sebastian Korten)<br />
* support arbitrary darcs command in darcs-test (Alexander Njemz)<br />
* output ISO dates in darcs changes? ([http://bugs.darcs.net/issue140 issue140], Alexander N, may be not a good idea)<br />
* add a last regrets prompt to interactive patch selection ([http://bugs.darcs.net/issue1920 issue1920], [http://bugs.darcs.net/patch655 patch655], Johannes Weiß)<br />
* [in-progress] support removing changes in amend-record ([http://bugs.darcs.net/issue1470 issue1470], Johannes Weiß)<br />
<br />
== wxHaskell ==<br />
<br />
* a Windows build fix ([https://sourceforge.net/mailarchive/forum.php?thread_name=CAA5%3D7kb%2BCmJ178tvrxtOnuswWBeBxYpSotiQWRXuKE3m_sByXA%40mail.gmail.com&forum_name=wxhaskell-devel patch])<br />
* a fix for [https://sourceforge.net/tracker/?func=detail&aid=3019730&group_id=73133&atid=536845 an issue with colorDialog] ([https://sourceforge.net/mailarchive/forum.php?thread_name=20110813150933.GA758%40dewdrop.local&forum_name=wxhaskell-devel patch])<br />
<br />
== hCole-server ==<br />
<br />
* A Snap-based web application that interacts with the COLE (see http://portal.acm.org/citation.cfm?id=1356080 and http://portal.acm.org/citation.cfm?id=1772965) framework for exploring compiler optimisation levels. The purpose of the web app is that collaborators can submit optimisation sequences to the COLE backend and retrieve the results when they are available after measuring.<br />
* Git repository of the web application can be found at https://github.com/itkovian/hcole-server<br />
<br />
== GObject Introspection ==<br />
<br />
* Work-in-progress binding generator for GObject-based libraries such as Gtk+ 3.<br />
* Started switching to [http://hackage.haskell.org/package/haskell-src-exts-1.11.1 haskell-src-exts] for code generation.<br />
* Patches currently on the ''camhac'' branch on [https://gitorious.org/haskell-gi/haskell-gi gitorious].<br />
<br />
== Snap Framework ==<br />
<br />
* Snap 0.5.3 and 0.5.3.1 released!<br />
<br />
* Several bugs squashed or nearly-squashed: [https://github.com/snapframework/snap-core/issues/2 #2] (IPv6 support, from Vlad Hanciuta), [https://github.com/snapframework/snap-core/issues/77 #77], [https://github.com/snapframework/snap-core/issues/78 #78], and [https://github.com/snapframework/snap-core/issues/79 #79].<br />
<br />
* File upload code: replaced "openBinaryTempFile" with something less dumb (mkstemp) on unix, and fixed some iteratee cleanup problems using an MVar finalizer<br />
<br />
* Removed the template haskell code from Data.Concurrent.HashMap in snap-server<br />
<br />
* Some work has been done on the authentication Snaplet, including an (incomplete) HDBC backend for it. An early work-in-progress can be found here: https://github.com/norm2782/snap<br />
* An example application which uses Snap 0.6 has been improved to use the authentication Snaplet. Another work-in-progress: https://github.com/norm2782/snap-guestbook<br />
<br />
== Data.Text ==<br />
<br />
* Further benchmarking, bug fixing to support the UTF-8 port<br />
* Progress can be found in the ''utf8'' branch [http://github.com/jaspervdj/text here]<br />
* The [http://jaspervdj.be/files/text.html GSoC project] is basically done, next up is writing a summary report of benchmark results and what advantages and disadvantages come with the port<br />
<br />
== hs-poker ==<br />
<br />
* A "redneck naive" poker hand evaluator. Code is on github (https://github.com/fffej/HS-Poker). Hopefully intend to turn this into a poker bot playground for Haskell (Jeff / Sebastian)<br />
<br />
== haskell-mpi ==<br />
* New version 1.1.0 uploaded to hackage, including support for more MPI implementations, bugfixes and general awesomness<br />
* Upcoming Monad Reader would feature and article about parallel programming with MPI, written during the course of the hackathon (Dmitry Astapov)<br />
<br />
== HTTP ==<br />
<br />
Some work was done on setting up tests for HTTP. Additionally, some bugs were fixed, code was cleaned up, warnings removed and a start was made on improving the Network.Browser module.<br />
<br />
== EchoNest API ==<br />
<br />
A very nascent API for accessing the EchoNest Music API http://developer.echonest.com/docs/v4/index.html . Coming to a GitHub server in the near future, as soon as it stops looking so ugly (Ian Knopke / Jose Calderon).<br />
<br />
== TagSoup/Derive/HLint ==<br />
<br />
All the above packages got upgraded to the latest GHC, along with a few bug fixes (Derive now deals with singleton constructors with no fields, HLint now supports an ANSI CPP flag) (Neil Mitchell)<br />
<br />
== Hoogle ==<br />
<br />
The current Hoogle parser for user queries is old, doesn't parse everything correctly, and in particular doesn't deal well with partial queries (when the user is still typing their search). We discussed lots of edge cases, and started implementing a new version (Jacek Generowicz, with guidance from Neil Mitchell)<br />
<br />
== CmdArgs ==<br />
<br />
The CmdArgs package lets you concisely specific command line arguments. I ported the package to GHC 7.2.1, did some cleanups, and fixed some bugs (you can now use Int64 etc). I then started working on two new features: 1) Given a CmdArgs program (such as Hoogle) you can specify you want to enter the arguments via a GUI hosted in the web browser. Currently the GUI is a simple textbox with realtime validation, but in future it will become a structured command line argument editor based on the options to your tool. 2) Adding automatic bash autocompletion - some of the work has been done, but the details are not yet finished. (Neil Mitchell)<br />
<br />
== Hackage server ==<br />
<br />
Further refactoring work, simplification of HTTP basic/digest authentication code. Started work on serving package changelogs. Improvements to admin pages to make various features more discoverable (Duncan Coutts, Stefan Wehr, Ben Millwood).<br />
<br />
Hackathon branch of the code is at (not all patches have been submitted yet):<br />
<br />
darcs get http://code.haskell.org/~duncan/camhac/hackage-server/<br />
<br />
== Bittorrent DHT ==<br />
<br />
Initial work on implementing [http://www.bittorrent.org/beps/bep_0005.html BEP 0005] in Haskell. Some core data structures seem to be working (although untested) and I'm currently working on the protocol. I will probably merge this into Haskell Torrent when everything is working, but I intend to keep the library available separately as I see potential uses for the network other than Bittorrent. (Alex Horsman)<br />
<br />
https://github.com/aninhumer/haskell-dht<br />
<br />
== LambdaHack ==<br />
<br />
Discussed gameplay and hacks, annotated the code with the discussion results and finally accepted [https://github.com/kosmikus/LambdaHack/pull/11 the pull request] from [http://hackage.haskell.org/package/Allure Allure of the Stars] to [http://hackage.haskell.org/package/LambdaHack LambdaHack].<br />
<br />
== HaskelSSHClient ==<br />
<br />
Hacked around a bit on the Haskel SSH Client. Work was started on making it able to do re-keying after the initial key exchange, but it is unfinished for now... (Bart Coppens)<br />
<br />
https://github.com/bcoppens/HaskellSshClient<br />
<br />
== Haskell Test Framework (HTF) ==<br />
<br />
* New '--quiet' flag: only produces output for failing tests (FINISHED)<br />
* Output a diff if an assertEqual fails (not yet finished)<br />
<br />
== Stack traces in GHC ==<br />
<br />
I (Simon M.) was working on adding better support for source code annotations in GHC's Core language, and unifying the way we handle profiling cost centres, coverage annotations, and breakpoints in the GHCi debugger. I'm working on a new semantics for cost centre stacks, which will allow us to track call stacks at runtime. This will not only give us more accurate profiling, but also let us report stack traces on errors (e.g. head []), perhaps enabled by a compile-time option.<br />
<br />
== TLS ==<br />
<br />
lots of various misc improvements: re-work records for more type safety, support for compression, initial support of version 1.2. (Vincent Hanquez)<br />
<br />
https://github.com/vincenthz/hs-tls<br />
<br />
== Pattern Synonyms ==<br />
Simon PJ, Simon M, and I (Lennart Augustsson) hashed out a design for pattern synonyms. I've barely begun implementation, so don't expect anything just yet.<br />
<br />
http://hackage.haskell.org/trac/ghc/wiki/PatternSynonyms<br />
<br />
== Frequent Subgraph Algorithm ==<br />
I (Stephen Lavelle) implemented the vSiGraM algorithm for searching for frequent vertex-disjoint subgraphs of large graphs. Doesn't really work for large graphs, though - 'tis quite slow right now.<br />
<br />
https://github.com/increpare/vsigram<br />
<br />
== Data.ByteString.Lazy.Builder ==<br />
<br />
Duncan Coutts and Johan Tibell reviewed my (Simon Meier) work on a lazy bytestring builder for the 'bytestring' library; based on blaze-builder. The API and implementation is now complete. Documentation is there, but needs lots of polishing. I also gave a talk on when and how to use the bytestring builder. The slides and example code are available from [https://github.com/meiersi/bytestring/blob/master/bench/CSV.hs github].<br />
<br />
== Error reporting for JsonGrammar ==<br />
<br />
Some progress on better error reporting for the JSON conversion functions in the [http://hackage.haskell.org/package/JsonGrammar JsonGrammar package] was made. Now <hask>fromJson</hask> no longer says <hask>Nothing</hask> when there is an error in the input JSON. Progress can be [https://github.com/MedeaMelana/JsonGrammar/tree/errors tracked on GitHub]. When finished it will be merged back into the master branch and released in a new version on hackage.</div>MartijnVanSteenbergenhttps://wiki.haskell.org/CamHac/PostHackathonReportCamHac/PostHackathonReport2011-08-16T13:09:39Z<p>MartijnVanSteenbergen: added JsonGrammar section</p>
<hr />
<div>= Post-Hackathon Report =<br />
<br />
This page is for listing what was done during the Hackathon. Please add a short description of what you worked on, with links to relevant blog posts, hackage packages, commits, etc.<br />
<br />
== fclabels 1.0 release ==<br />
<br />
New release of the '''fclabels''' package. The new package has a lot of code and documentation cleanups, support for partial labels in the case of multi-constructor datatypes and is about 20x as fast for setting and modifying as the previous version. Thanks everyone for helping me out!<br />
<br />
Hackage: http://hackage.haskell.org/package/fclabels-1.0.1<br />
<br />
Github: http://github.com/sebastiaanvisser/fclabels<br />
<br />
== GHC and base library improvements ==<br />
<br />
* [http://hackage.haskell.org/trac/ghc/ticket/5413 Add primops for bit population count]. These primops compile down to `POPCNT` instructions where available and fast fallbacks (implemented in C) otherwise.<br />
<br />
* [http://hackage.haskell.org/trac/ghc/ticket/5414 Add unchecked left and right bit shifts]: The Data.Bits.shift method uses a branch to check if the shift amount is larger than the word size and returns 0 in these cases. This extra safety makes performance worse in bit twiddling code.<br />
<br />
* Discussed unpacking of enums in GHC (not yet implemented).<br />
<br />
* Discussed refactoring compiler/util/Digraph.lhs into a reusable graph combinator library, along with porting over hoopl's control-flow-graph traversals (not yet implemented).<br />
<br />
== Context synonym families ==<br />
<br />
Started working on context synonym families and indexed context synonym families. We make this work by giving evidence the new kind Fact, and then allowing any type of kind Fact to appear on the left of a => arrow.<br />
<br />
(Max Bolingbroke, Dominic Orchard and Nicolas Wu)<br />
<br />
== Darcs ==<br />
<br />
New contributors:<br />
<br />
* use red text to report when <font color="red">we have a conflict</font> ([http://bugs.darcs.net/issue1681 issue1681],[http://bugs.darcs.net/patch646 patch646], Jeff Foster)<br />
* support 'since' in English dates parser<br />
* filter SSH output ([http://bugs.darcs.net/issue845 issue845], Jeff Foster and Sebastian Korten)<br />
* support arbitrary darcs command in darcs-test (Alexander Njemz)<br />
* output ISO dates in darcs changes? ([http://bugs.darcs.net/issue140 issue140], Alexander N, may be not a good idea)<br />
* add a last regrets prompt to interactive patch selection ([http://bugs.darcs.net/issue1920 issue1920], [http://bugs.darcs.net/patch655 patch655], Johannes Weiß)<br />
* [in-progress] support removing changes in amend-record ([http://bugs.darcs.net/issue1470 issue1470], Johannes Weiß)<br />
<br />
== wxHaskell ==<br />
<br />
* a Windows build fix ([https://sourceforge.net/mailarchive/forum.php?thread_name=CAA5%3D7kb%2BCmJ178tvrxtOnuswWBeBxYpSotiQWRXuKE3m_sByXA%40mail.gmail.com&forum_name=wxhaskell-devel patch])<br />
* a fix for [https://sourceforge.net/tracker/?func=detail&aid=3019730&group_id=73133&atid=536845 an issue with colorDialog] ([https://sourceforge.net/mailarchive/forum.php?thread_name=20110813150933.GA758%40dewdrop.local&forum_name=wxhaskell-devel patch])<br />
<br />
== hCole-server ==<br />
<br />
* A Snap-based web application that interacts with the COLE (see http://portal.acm.org/citation.cfm?id=1356080 and http://portal.acm.org/citation.cfm?id=1772965) framework for exploring compiler optimisation levels. The purpose of the web app is that collaborators can submit optimisation sequences to the COLE backend and retrieve the results when they are available after measuring.<br />
* Git repository of the web application can be found at https://github.com/itkovian/hcole-server<br />
<br />
== GObject Introspection ==<br />
<br />
* Work-in-progress binding generator for GObject-based libraries such as Gtk+ 3.<br />
* Started switching to [http://hackage.haskell.org/package/haskell-src-exts-1.11.1 haskell-src-exts] for code generation.<br />
* Patches currently on the ''camhac'' branch on [https://gitorious.org/haskell-gi/haskell-gi gitorious].<br />
<br />
== Snap Framework ==<br />
<br />
* Snap 0.5.3 and 0.5.3.1 released!<br />
<br />
* Several bugs squashed or nearly-squashed: [https://github.com/snapframework/snap-core/issues/2 #2] (IPv6 support, from Vlad Hanciuta), [https://github.com/snapframework/snap-core/issues/77 #77], [https://github.com/snapframework/snap-core/issues/78 #78], and [https://github.com/snapframework/snap-core/issues/79 #79].<br />
<br />
* File upload code: replaced "openBinaryTempFile" with something less dumb (mkstemp) on unix, and fixed some iteratee cleanup problems using an MVar finalizer<br />
<br />
* Removed the template haskell code from Data.Concurrent.HashMap in snap-server<br />
<br />
* Some work has been done on the authentication Snaplet, including an (incomplete) HDBC backend for it. An early work-in-progress can be found here: https://github.com/norm2782/snap<br />
* An example application which uses Snap 0.6 has been improved to use the authentication Snaplet. Another work-in-progress: https://github.com/norm2782/snap-guestbook<br />
<br />
== Data.Text ==<br />
<br />
* Further benchmarking, bug fixing to support the UTF-8 port<br />
* Progress can be found in the ''utf8'' branch [http://github.com/jaspervdj/text here]<br />
* The [http://jaspervdj.be/files/text.html GSoC project] is basically done, next up is writing a summary report of benchmark results and what advantages and disadvantages come with the port<br />
<br />
== hs-poker ==<br />
<br />
* A "redneck naive" poker hand evaluator. Code is on github (https://github.com/fffej/HS-Poker). Hopefully intend to turn this into a poker bot playground for Haskell (Jeff / Sebastian)<br />
<br />
== haskell-mpi ==<br />
* New version 1.1.0 uploaded to hackage, including support for more MPI implementations, bugfixes and general awesomness<br />
* Upcoming Monad Reader would feature and article about parallel programming with MPI, written during the course of the hackathon (Dmitry Astapov)<br />
<br />
== HTTP ==<br />
<br />
Some work was done on setting up tests for HTTP. Additionally, some bugs were fixed, code was cleaned up, warnings removed and a start was made on improving the Network.Browser module.<br />
<br />
== EchoNest API ==<br />
<br />
A very nascent API for accessing the EchoNest Music API http://developer.echonest.com/docs/v4/index.html . Coming to a GitHub server in the near future, as soon as it stops looking so ugly (Ian Knopke / Jose Calderon).<br />
<br />
== TagSoup/Derive/HLint ==<br />
<br />
All the above packages got upgraded to the latest GHC, along with a few bug fixes (Derive now deals with singleton constructors with no fields, HLint now supports an ANSI CPP flag) (Neil Mitchell)<br />
<br />
== Hoogle ==<br />
<br />
The current Hoogle parser for user queries is old, doesn't parse everything correctly, and in particular doesn't deal well with partial queries (when the user is still typing their search). We discussed lots of edge cases, and started implementing a new version (Jacek Generowicz, with guidance from Neil Mitchell)<br />
<br />
== CmdArgs ==<br />
<br />
The CmdArgs package lets you concisely specific command line arguments. I ported the package to GHC 7.2.1, did some cleanups, and fixed some bugs (you can now use Int64 etc). I then started working on two new features: 1) Given a CmdArgs program (such as Hoogle) you can specify you want to enter the arguments via a GUI hosted in the web browser. Currently the GUI is a simple textbox with realtime validation, but in future it will become a structured command line argument editor based on the options to your tool. 2) Adding automatic bash autocompletion - some of the work has been done, but the details are not yet finished. (Neil Mitchell)<br />
<br />
== Hackage server ==<br />
<br />
Further refactoring work, simplification of HTTP basic/digest authentication code. Started work on serving package changelogs. Improvements to admin pages to make various features more discoverable (Duncan Coutts, Stefan Wehr, Ben Millwood).<br />
<br />
Hackathon branch of the code is at (not all patches have been submitted yet):<br />
<br />
darcs get http://code.haskell.org/~duncan/camhac/hackage-server/<br />
<br />
== Bittorrent DHT ==<br />
<br />
Initial work on implementing [http://www.bittorrent.org/beps/bep_0005.html BEP 0005] in Haskell. Some core data structures seem to be working (although untested) and I'm currently working on the protocol. I will probably merge this into Haskell Torrent when everything is working, but I intend to keep the library available separately as I see potential uses for the network other than Bittorrent. (Alex Horsman)<br />
<br />
https://github.com/aninhumer/haskell-dht<br />
<br />
== LambdaHack ==<br />
<br />
Discussed gameplay and hacks, annotated the code with the discussion results and finally accepted [https://github.com/kosmikus/LambdaHack/pull/11 the pull request] from [http://hackage.haskell.org/package/Allure Allure of the Stars] to [http://hackage.haskell.org/package/LambdaHack LambdaHack].<br />
<br />
== HaskelSSHClient ==<br />
<br />
Hacked around a bit on the Haskel SSH Client. Work was started on making it able to do re-keying after the initial key exchange, but it is unfinished for now... (Bart Coppens)<br />
<br />
https://github.com/bcoppens/HaskellSshClient<br />
<br />
== Haskell Test Framework (HTF) ==<br />
<br />
* New '--quiet' flag: only produces output for failing tests (FINISHED)<br />
* Output a diff if an assertEqual fails (not yet finished)<br />
<br />
== Stack traces in GHC ==<br />
<br />
I (Simon M.) was working on adding better support for source code annotations in GHC's Core language, and unifying the way we handle profiling cost centres, coverage annotations, and breakpoints in the GHCi debugger. I'm working on a new semantics for cost centre stacks, which will allow us to track call stacks at runtime. This will not only give us more accurate profiling, but also let us report stack traces on errors (e.g. head []), perhaps enabled by a compile-time option.<br />
<br />
== TLS ==<br />
<br />
lots of various misc improvements: re-work records for more type safety, support for compression, initial support of version 1.2. (Vincent Hanquez)<br />
<br />
https://github.com/vincenthz/hs-tls<br />
<br />
== Pattern Synonyms ==<br />
Simon PJ, Simon M, and I (Lennart Augustsson) hashed out a design for pattern synonyms. I've barely begun implementation, so don't expect anything just yet.<br />
<br />
http://hackage.haskell.org/trac/ghc/wiki/PatternSynonyms<br />
<br />
== Frequent Subgraph Algorithm ==<br />
I (Stephen Lavelle) implemented the vSiGraM algorithm for searching for frequent vertex-disjoint subgraphs of large graphs. Doesn't really work for large graphs, though - 'tis quite slow right now.<br />
<br />
https://github.com/increpare/vsigram<br />
<br />
== Data.ByteString.Lazy.Builder ==<br />
<br />
Duncan Coutts and Johan Tibell reviewed my (Simon Meier) work on a lazy bytestring builder for the 'bytestring' library; based on blaze-builder. The API and implementation is now complete. Documentation is there, but needs lots of polishing. I also gave a talk on when and how to use the bytestring builder. The slides and example code are available from [https://github.com/meiersi/bytestring/blob/master/bench/CSV.hs github].<br />
<br />
== Error reporting for JsonGrammar ==<br />
<br />
Some progress on better error reporting for the JSON conversion functions in the [http://hackage.haskell.org/package/JsonGrammar JsonGrammar package] was made. Now fromJson no longer says 'Nothing' when there is an error in the input JSON. Progress can be [https://github.com/MedeaMelana/JsonGrammar/tree/errors tracked on GitHub]. When finished it will be merged back into the master branch and released in a new version on hackage.</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Ghent_Functional_Programming_Group/BelHac/RegisterGhent Functional Programming Group/BelHac/Register2010-10-11T10:19:34Z<p>MartijnVanSteenbergen: added Martijn</p>
<hr />
<div>Important: Please wait for a confirmation email before booking any flights/hotels.<br />
<br />
Registration is via email to Jasper Van der Jeugt at<br />
<br />
jaspervdj+belhac@gmail.com<br />
<br />
with the subject<br />
<br />
BelHac registration <br />
<br />
and body containing the following information:<br />
<br />
Name:<br />
#haskell nick: (if applicable)<br />
Email:<br />
Food restrictions:<br />
Days attending: <br />
<br />
Here is an example:<br />
<br />
Name: Jasper Van der Jeugt<br />
Nick: jaspervdj<br />
Email: jaspervdj@gmail.com<br />
Food restrictions: Raw flesh only<br />
Days attending: Friday, saturday and sunday<br />
<br />
If you want, you can also add you name here:<br />
<br />
{| class="wikitable"<br />
! Nickname<br />
! Real Name<br />
! Affiliation<br />
! Mobile #<br />
! Email<br />
! Arriving - Departing<br />
! Accomodation<br />
|-<br />
| jaspervdj<br />
| Jasper Van der Jeugt<br />
| Ghent University<br />
| +32 476 26 48 47<br />
| jaspervdj@gmail.com<br />
| <br />
| Has a small place in Ghent<br />
|-<br />
| Itkovian<br />
| Andy Georges<br />
| Ghent University/FWO<br />
| <br />
| itkovian@gmail.com<br />
|<br />
| Lives in Ostend, arrives by train on daily basis<br />
|-<br />
| Javache<br />
| Pieter De Baets<br />
| Ghent University<br />
| <br />
| pieter.debaets@gmail.com<br />
|<br />
|<br />
|-<br />
| boegel<br />
| Kenneth Hoste<br />
| Ghent University<br />
| <br />
| kenneth.hoste@ugent.be<br />
|<br />
| commute to/from Ghent daily<br />
|-<br />
| BCoppens<br />
| Bart Coppens<br />
| Ghent University<br />
| <br />
| bart.coppens@elis.ugent.be<br />
|<br />
|<br />
|-<br />
| jejansse<br />
| Jeroen Janssen<br />
| VUB<br />
|<br />
| jejansse@gmail.com<br />
|<br />
| Lives in Ghent.<br />
|-<br />
| Feuerbach<br />
| Roman Cheplyaka<br />
| <br />
| +380662285780<br />
| roma@ro-che.info<br />
| unknown yet<br />
| unknown yet<br />
|-<br />
| solidsnack<br />
| Jason Dusek<br />
| Heroku<br />
| +1 415 894 2162<br />
| jason.dusek@gmail.com<br />
| 5th-7th<br />
| Probably Monasterium.<br />
|-<br />
| kosmikus<br />
| Andres L&ouml;h<br />
| Well-Typed LLP<br />
|<br />
| mail@andres-loeh.de<br />
| 5th-7th<br />
|<br />
|-<br />
| Igloo<br />
| Ian Lynagh<br />
| Well-Typed LLP<br />
|<br />
| igloo@earth.li<br />
| 5th-7th<br />
|<br />
|-<br />
| dcoutts<br />
| Duncan Coutts<br />
| Well-Typed LLP<br />
|<br />
| duncan.coutts@googlemail.com<br />
| 5th-7th<br />
|<br />
|-<br />
| ADEpt<br />
| Dmitry Astapov<br />
| Well-Typed LLP<br />
|<br />
| dastapov@gmail.com<br />
| 5th-7th<br />
|<br />
|-<br />
| wvdschel<br />
| Wim Vander Schelden<br />
| Ghent University<br />
| <br />
| belhac@fixnum.org<br />
| <br />
| Lives in Ghent<br />
|-<br />
| sjoerd_visscher<br />
| Sjoerd Visscher<br />
| SDL Xopus<br />
| <br />
| sjoerd@w3future.com<br />
| 5th-7th<br />
| youth hostel<br />
|-<br />
| mietek<br />
| Miëtek Bak<br />
| Erlang Solutions<br />
| <br />
| mietek@gmail.com<br />
| 5th-7th<br />
| Open for suggestions<br />
|<br />
|-<br />
| <br />
| Steven Keuchel<br />
| Utrecht University<br />
| <br />
| <br />
| 5th-7th<br />
| <br />
|-<br />
| chr1s<br />
| Chris Eidhof<br />
| <br />
| <br />
| chris@eidhof.nl<br />
| 5th-7th<br />
| youth hostel<br />
|-<br />
|fphh<br />
|Heinrich Hördegen<br />
|Funktionale Programmierung<br />
|<br />
|hoerdegen@laposte.net<br />
|5th-7th<br />
|Open for suggestions<br />
|-<br />
| <br />
| Tom Lokhorst<br />
| <br />
| <br />
| tom@lokhorst.eu<br />
| 5th-7th<br />
| youth hostel<br />
|-<br />
| sioraiocht<br />
| Tom Harper<br />
| Oxford University Computing Laboratory<br />
| +44 7533 998 591<br />
| rtomharper@gmail.com<br />
| Friday-Sunday<br />
| <br />
|-<br />
| mcclurmc<br />
| Mike McClurg<br />
| <br />
| <br />
| mike.mcclurg@gmail.com<br />
| Friday-Sunday<br />
| <br />
|-<br />
| chrisdone<br />
| Chris Done<br />
| CREATE-NET<br />
| TBA<br />
| chrisdone@gmail.com<br />
| 5th-7th<br />
| <br />
|-<br />
| lpeterse<br />
| Lars Petersen<br />
| University of Osnabrück<br />
| <br />
| info@lars-petersen.net<br />
| 5th-7th<br />
| Hostel<br />
|-<br />
| sfvisser<br />
| Sebastiaan Visser<br />
| Silk<br />
| <br />
| haskell@fvisser.nl<br />
| 5th-7th<br />
| youth hostel<br />
|-<br />
| alatter<br />
| Antoine Latter<br />
|<br />
|<br />
| aslatter@gmail.com<br />
| 5th - 7th<br />
| Hostel<br />
|-<br />
| marcmo<br />
| oliver mueller<br />
|<br />
|<br />
| oliver.mueller@gmail.com<br />
| 5th - 7th<br />
| Hostel<br />
|-<br />
| kayuri<br />
| Yuriy Kashnikov<br />
| <br />
| <br />
| yuriy.kashnikov@gmail.com<br />
| 5th-7th<br />
| <br />
|-<br />
| nomeata<br />
| Joachim Breitner<br />
| <br />
| <br />
| mail@joachim-breitner.de<br />
| 5th-7th<br />
| still looking<br />
|-<br />
| dons<br />
| Don Stewart<br />
| [http://www.galois.com Galois, Inc]<br />
| 07961033604<br />
| dons@galois.com<br />
| 5th - 7th.<br />
| <br />
|-<br />
| basvandijk<br />
| Bas van Dijk<br />
| <br />
| +31 614065248<br />
| v.dijk.bas@gmail.com<br />
| 5th - 7th<br />
| still looking<br />
|-<br />
| roelvandijk<br />
| Roel van Dijk<br />
| <br />
| +31 612856453<br />
| vandijk.roel@gmail.com<br />
| 5th - 7th<br />
| still looking<br />
|-<br />
| <br />
| Martijn van Steenbergen<br />
| <br />
| <br />
| <br />
| 5th - 7th<br />
| hostel47<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/QuasiquotationQuasiquotation2010-10-01T11:35:41Z<p>MartijnVanSteenbergen: removed $ in QQ examples</p>
<hr />
<div>This is a tutorial for the quasiquoting facility described in<br />
[http://www.eecs.harvard.edu/~mainland/ghc-quasiquoting/mainland07quasiquoting.pdf Why It's Nice to be Quoted: Quasiquoting for Haskell].<br />
<br />
Quasiquoting allows programmers to use custom, domain-specific syntax to construct fragments of their program. Along with Haskell's existing support for domain specific languages, you are now free to use new syntactic forms for your EDSLs.<br />
<br />
More information on GHC's support for quasiquoting may be found:<br />
<br />
* [http://www.haskell.org/ghc/docs/latest/html/users_guide/template-haskell.html#th-quasiquotation Using QQ with Template Haskell]<br />
* [http://www.eecs.harvard.edu/~mainland/ghc-quasiquoting/mainland07quasiquoting.pdf Why It's Nice to be Quoted: Quasiquoting for Haskell] :: PDF<br />
<br />
And a number of production examples:<br />
<br />
* The [[jmacro]] JavaScript generation library.<br />
* [http://hackage.haskell.org/package/interpolatedstring-qq Quasiquoter for Ruby-style interpolated strings]<br />
* [http://hackage.haskell.org/package/interpolatedstring-perl6 interpolatedstring-perl6 library: QuasiQuoter for Perl6-style multi-line interpolated strings with "q"]<br />
* [http://hackage.haskell.org/package/regexqq Quasiquoter for regular expressions]<br />
* [http://hackage.haskell.org/package/lighttpd-conf-qq A QuasiQuoter for lighttpd configuration files]<br />
<br />
<br />
Note that the syntax for<br />
quasiquotation has changed since the paper was written: now one writes<br />
<hask>[expr|...|]</hask> instead of <hask>[:expr|...|]</hask>. Quasiquotation<br />
appeared in GHC 6.9 and is enabled with the <code>QuasiQuotes</code> language<br />
option (<code>-XQuasiQuotes</code> on the command line or <hask>{-# LANGUAGE QuasiQuotes #-}</hask> in a source file).<br />
<br />
We show how to build a quasiquoter for a simple mathematical expression<br />
language. Although the example is small, it demonstrates all aspects of building<br />
a quasiquoter. We do not mean to suggest that one gains much from a quasiquoter<br />
for such a small language relative to using abstract syntax directly except from<br />
a pedagogical point of view---this is just a tutorial!<br />
<br />
The tutorial is runnable if its contents is placed in files as follows:<br />
<br />
Place the contents of the [[#Syntax]] and [[#Parsing]] sections in the file <code>Expr.hs</code><br />
with header<br />
<br />
<haskell><br />
{-# LANGUAGE DeriveDataTypeable #-}<br />
module Expr (Expr(..),<br />
BinOp(..),<br />
eval,<br />
parseExpr)<br />
where<br />
<br />
import Data.Generics<br />
import Text.ParserCombinators.Parsec<br />
</haskell><br />
<br />
Place the contents of the section [[#The Quasiquoter]] in a<br />
file <code>Expr/Quote.hs</code> with header<br />
<br />
<haskell><br />
module Expr.Quote (expr) where<br />
<br />
import Data.Generics<br />
import qualified Language.Haskell.TH as TH<br />
import Language.Haskell.TH.Quote<br />
<br />
import Expr<br />
</haskell><br />
<br />
= Syntax =<br />
<br />
Our simple expression language consists of integers, the standard operators<br />
+,x,*,/, and parenthesized expressions. We will write a single parser that takes<br />
concrete syntax for this language and transforms it to abstract syntax. Using<br />
the SYB approach to generic programming, we will then use this parser to produce<br />
expression and pattern quasiquoters. Our quasiquoter will allow us to write<br />
<hask>[expr|1 + 3|]</hask> directly in Haskell source code instead of the<br />
corresponding abstract syntax.<br />
<br />
An obvious datatype for the abstract syntax of this simple language is:<br />
<br />
<haskell><br />
data Expr = IntExpr Integer<br />
| BinopExpr (Integer -> Integer -> Integer) Expr Expr<br />
deriving(Show)<br />
</haskell><br />
<br />
Unfortunately, this won't do for our quasiquoter. First of all, the SYB<br />
technique we use cannot handle function types in a generic way, so the BinopExpr<br />
constructor must be modified. SYB also requires that we derive Typeable and<br />
Data, a trivial change. Finally, we want to support antiquoting for two<br />
syntactic categories, expressions and integers. With antiquoting support, we can<br />
write [expr|$x + $int:y|] where x and y are in-scope variables with types Expr<br />
and Integer, respectively. The final data types for our abstract syntax are:<br />
<br />
<haskell><br />
data Expr = IntExpr Integer<br />
| AntiIntExpr String<br />
| BinopExpr BinOp Expr Expr<br />
| AntiExpr String<br />
deriving(Show, Typeable, Data)<br />
<br />
data BinOp = AddOp<br />
| SubOp<br />
| MulOp<br />
| DivOp<br />
deriving(Show, Typeable, Data)<br />
</haskell><br />
<br />
An evaluator for our abstract syntax can be written as follows:<br />
<br />
<haskell><br />
eval :: Expr -> Integer<br />
eval (IntExpr n) = n<br />
eval (BinopExpr op x y) = (opToFun op) (eval x) (eval y)<br />
where<br />
opToFun AddOp = (+)<br />
opToFun SubOp = (-)<br />
opToFun MulOp = (*)<br />
opToFun DivOp = div<br />
</haskell><br />
<br />
= Parsing =<br />
<br />
We use Parsec to write a parser for our expression language. Note that we have<br />
(somewhat arbitrarily) chosen the syntax for antiquotaton to be as in the above<br />
example; a quasiquoter may choose whatever syntax she wishes.<br />
<br />
<haskell><br />
small = lower <|> char '_'<br />
large = upper<br />
idchar = small <|> large <|> digit <|> char '\''<br />
<br />
lexeme p = do{ x <- p; spaces; return x }<br />
symbol name = lexeme (string name)<br />
parens p = between (symbol "(") (symbol ")") p<br />
<br />
expr :: CharParser st Expr<br />
expr = term `chainl1` addop<br />
<br />
term :: CharParser st Expr<br />
term = factor `chainl1` mulop<br />
<br />
factor :: CharParser st Expr<br />
factor = parens expr <|> integer <|> try antiIntExpr <|> antiExpr<br />
<br />
mulop = do{ symbol "*"; return $ BinopExpr MulOp }<br />
<|> do{ symbol "/"; return $ BinopExpr DivOp }<br />
<br />
addop = do{ symbol "+"; return $ BinopExpr AddOp }<br />
<|> do{ symbol "-"; return $ BinopExpr SubOp }<br />
<br />
integer :: CharParser st Expr<br />
integer = lexeme $ do{ ds <- many1 digit ; return $ IntExpr (read ds) }<br />
<br />
ident :: CharParser s String<br />
ident = do{ c <- small; cs <- many idchar; return (c:cs) }<br />
<br />
antiIntExpr = lexeme $ do{ symbol "$int:"; id <- ident; return $ AntiIntExpr id }<br />
antiExpr = lexeme $ do{ symbol "$"; id <- ident; return $ AntiExpr id }<br />
</haskell><br />
<br />
The helper function parseExpr takes a source code position (consisting of a file<br />
name, line and column) and a string and returns a value of type Expr. This<br />
helper function also ensures that we can parse the whole string rather than just<br />
a prefix.<br />
<br />
<haskell><br />
parseExpr :: Monad m => (String, Int, Int) -> String -> m Expr<br />
parseExpr (file, line, col) s =<br />
case runParser p () "" s of<br />
Left err -> fail $ show err<br />
Right e -> return e<br />
where<br />
p = do pos <- getPosition<br />
setPosition $<br />
(flip setSourceName) file $<br />
(flip setSourceLine) line $<br />
(flip setSourceColumn) col $<br />
pos<br />
spaces<br />
e <- expr<br />
eof<br />
return e<br />
</haskell><br />
<br />
= The Quasiquoter =<br />
<br />
Remember, our quasiquoter allows us to write expression in our simple language,<br />
such as [expr|2 * 3|], directly in Haskell source code. This requires that the<br />
variable expr be in-scope when the quasiquote is encountered, and that it is<br />
bound to a value of type Language.Haskell.TH.Quote.QuasiQuoter, which contains<br />
an expression quoter and a pattern quoter. Note that expr must obey the same<br />
stage restrictions as Template Haskell; in particular, it may not be defined in<br />
the same module where it is used as a quasiquoter, but must be imported.<br />
<br />
Our expression and pattern quoters are quoteExprExp and quoteExprPat,<br />
respectively, so our quasiquoter expr is written as follows:<br />
<br />
<haskell><br />
quoteExprExp :: String -> TH.ExpQ<br />
quoteExprPat :: String -> TH.PatQ<br />
<br />
expr :: QuasiQuoter<br />
expr = QuasiQuoter quoteExprExp quoteExprPat<br />
</haskell><br />
<br />
Our quasiquoters re-use the parser we wrote in the previous section, parseExpr,<br />
and make use of the generic functions dataToExpQ and dataToPatQ (described in<br />
the Haskell Workshop paper). These functions, from the Language.Haskell.TH.Quote<br />
package, take a Haskell value and reflect it back into the language as Template<br />
Haskell abstract syntax. The catch is that we don't want to handle all values<br />
generically: antiquoted values must be handled specially. Consider the AntiExpr<br />
constructor; we don't want this constructor to be mapped to Template Haskell<br />
abstract syntax for the AntiExpr constructor, but to abstract syntax for the<br />
Haskell variable named by the constructor's argument. The extQ combinator allows<br />
us to do this nicely by defining a function antiExprExp that handles<br />
antiquotations.<br />
<br />
<haskell><br />
quoteExprExp s = do loc <- TH.location<br />
let pos = (TH.loc_filename loc,<br />
fst (TH.loc_start loc),<br />
snd (TH.loc_start loc))<br />
expr <- parseExpr pos s<br />
dataToExpQ (const Nothing `extQ` antiExprExp) expr<br />
<br />
antiExprExp :: Expr -> Maybe (TH.Q TH.Exp)<br />
antiExprExp (AntiIntExpr v) = Just $ TH.appE (TH.conE (TH.mkName "IntExpr"))<br />
(TH.varE (TH.mkName v))<br />
antiExprExp (AntiExpr v) = Just $ TH.varE (TH.mkName v)<br />
antiExprExp _ = Nothing<br />
</haskell><br />
<br />
The corresponding code for patterns is:<br />
<br />
<haskell><br />
quoteExprPat s = do loc <- TH.location<br />
let pos = (TH.loc_filename loc,<br />
fst (TH.loc_start loc),<br />
snd (TH.loc_start loc))<br />
expr <- parseExpr pos s<br />
dataToPatQ (const Nothing `extQ` antiExprPat) expr<br />
<br />
antiExprPat :: Expr -> Maybe (TH.Q TH.Pat)<br />
antiExprPat (AntiIntExpr v) = Just $ TH.conP (TH.mkName "IntExpr")<br />
[TH.varP (TH.mkName v)]<br />
antiExprPat (AntiExpr v) = Just $ TH.varP (TH.mkName v)<br />
antiExprPat _ = Nothing<br />
</haskell><br />
<br />
= Examples =<br />
<br />
We can now try out a few examples by invoking ghci as follows: <code>ghci -XQuasiQuotes Expr/Quote</code><br />
<br />
<pre><br />
> [expr|1 + 3 + 5|]<br />
BinopExpr AddOp (BinopExpr AddOp (IntExpr 1) (IntExpr 3)) (IntExpr 5) <br />
> eval [expr|1 + 3 + 5|]<br />
9 <br />
</pre><br />
<br />
Taking advantage of our quasiquoter, we can re-write our evaluator so it uses<br />
concrete syntax:<br />
<br />
<haskell><br />
eval' :: Expr -> Integer<br />
eval' [expr|$int:x|] = x<br />
eval' [expr|$x + $y|] = eval' x + eval' y<br />
eval' [expr|$x - $y|] = eval' x - eval' y<br />
eval' [expr|$x * $y|] = eval' x * eval' y<br />
eval' [expr|$x / $y|] = eval' x `div` eval' y<br />
</haskell><br />
<br />
Let's make sure it works as advertised:<br />
<br />
<pre><br />
> eval [expr|1 + 2 + 3|] == eval' [expr|1 + 2 + 3|]<br />
True <br />
> eval [expr|1 + 3 * 5|] == eval' [expr|1 + 3 * 5|]<br />
True <br />
</pre></div>MartijnVanSteenbergenhttps://wiki.haskell.org/QuasiquotationQuasiquotation2010-10-01T11:33:09Z<p>MartijnVanSteenbergen: removed $ in QQ example</p>
<hr />
<div>This is a tutorial for the quasiquoting facility described in<br />
[http://www.eecs.harvard.edu/~mainland/ghc-quasiquoting/mainland07quasiquoting.pdf Why It's Nice to be Quoted: Quasiquoting for Haskell].<br />
<br />
Quasiquoting allows programmers to use custom, domain-specific syntax to construct fragments of their program. Along with Haskell's existing support for domain specific languages, you are now free to use new syntactic forms for your EDSLs.<br />
<br />
More information on GHC's support for quasiquoting may be found:<br />
<br />
* [http://www.haskell.org/ghc/docs/latest/html/users_guide/template-haskell.html#th-quasiquotation Using QQ with Template Haskell]<br />
* [http://www.eecs.harvard.edu/~mainland/ghc-quasiquoting/mainland07quasiquoting.pdf Why It's Nice to be Quoted: Quasiquoting for Haskell] :: PDF<br />
<br />
And a number of production examples:<br />
<br />
* The [[jmacro]] JavaScript generation library.<br />
* [http://hackage.haskell.org/package/interpolatedstring-qq Quasiquoter for Ruby-style interpolated strings]<br />
* [http://hackage.haskell.org/package/interpolatedstring-perl6 interpolatedstring-perl6 library: QuasiQuoter for Perl6-style multi-line interpolated strings with "q"]<br />
* [http://hackage.haskell.org/package/regexqq Quasiquoter for regular expressions]<br />
* [http://hackage.haskell.org/package/lighttpd-conf-qq A QuasiQuoter for lighttpd configuration files]<br />
<br />
<br />
Note that the syntax for<br />
quasiquotation has changed since the paper was written: now one writes<br />
<hask>[expr|...|]</hask> instead of <hask>[:expr|...|]</hask>. Quasiquotation<br />
appeared in GHC 6.9 and is enabled with the <code>QuasiQuotes</code> language<br />
option (<code>-XQuasiQuotes</code> on the command line or <hask>{-# LANGUAGE QuasiQuotes #-}</hask> in a source file).<br />
<br />
We show how to build a quasiquoter for a simple mathematical expression<br />
language. Although the example is small, it demonstrates all aspects of building<br />
a quasiquoter. We do not mean to suggest that one gains much from a quasiquoter<br />
for such a small language relative to using abstract syntax directly except from<br />
a pedagogical point of view---this is just a tutorial!<br />
<br />
The tutorial is runnable if its contents is placed in files as follows:<br />
<br />
Place the contents of the [[#Syntax]] and [[#Parsing]] sections in the file <code>Expr.hs</code><br />
with header<br />
<br />
<haskell><br />
{-# LANGUAGE DeriveDataTypeable #-}<br />
module Expr (Expr(..),<br />
BinOp(..),<br />
eval,<br />
parseExpr)<br />
where<br />
<br />
import Data.Generics<br />
import Text.ParserCombinators.Parsec<br />
</haskell><br />
<br />
Place the contents of the section [[#The Quasiquoter]] in a<br />
file <code>Expr/Quote.hs</code> with header<br />
<br />
<haskell><br />
module Expr.Quote (expr) where<br />
<br />
import Data.Generics<br />
import qualified Language.Haskell.TH as TH<br />
import Language.Haskell.TH.Quote<br />
<br />
import Expr<br />
</haskell><br />
<br />
= Syntax =<br />
<br />
Our simple expression language consists of integers, the standard operators<br />
+,x,*,/, and parenthesized expressions. We will write a single parser that takes<br />
concrete syntax for this language and transforms it to abstract syntax. Using<br />
the SYB approach to generic programming, we will then use this parser to produce<br />
expression and pattern quasiquoters. Our quasiquoter will allow us to write<br />
<hask>[$expr|1 + 3|]</hask> directly in Haskell source code instead of the<br />
corresponding abstract syntax.<br />
<br />
An obvious datatype for the abstract syntax of this simple language is:<br />
<br />
<haskell><br />
data Expr = IntExpr Integer<br />
| BinopExpr (Integer -> Integer -> Integer) Expr Expr<br />
deriving(Show)<br />
</haskell><br />
<br />
Unfortunately, this won't do for our quasiquoter. First of all, the SYB<br />
technique we use cannot handle function types in a generic way, so the BinopExpr<br />
constructor must be modified. SYB also requires that we derive Typeable and<br />
Data, a trivial change. Finally, we want to support antiquoting for two<br />
syntactic categories, expressions and integers. With antiquoting support, we can<br />
write [$expr|$x + $int:y|] where x and y are in-scope variables with types Expr<br />
and Integer, respectively. The final data types for our abstract syntax are:<br />
<br />
<haskell><br />
data Expr = IntExpr Integer<br />
| AntiIntExpr String<br />
| BinopExpr BinOp Expr Expr<br />
| AntiExpr String<br />
deriving(Show, Typeable, Data)<br />
<br />
data BinOp = AddOp<br />
| SubOp<br />
| MulOp<br />
| DivOp<br />
deriving(Show, Typeable, Data)<br />
</haskell><br />
<br />
An evaluator for our abstract syntax can be written as follows:<br />
<br />
<haskell><br />
eval :: Expr -> Integer<br />
eval (IntExpr n) = n<br />
eval (BinopExpr op x y) = (opToFun op) (eval x) (eval y)<br />
where<br />
opToFun AddOp = (+)<br />
opToFun SubOp = (-)<br />
opToFun MulOp = (*)<br />
opToFun DivOp = div<br />
</haskell><br />
<br />
= Parsing =<br />
<br />
We use Parsec to write a parser for our expression language. Note that we have<br />
(somewhat arbitrarily) chosen the syntax for antiquotaton to be as in the above<br />
example; a quasiquoter may choose whatever syntax she wishes.<br />
<br />
<haskell><br />
small = lower <|> char '_'<br />
large = upper<br />
idchar = small <|> large <|> digit <|> char '\''<br />
<br />
lexeme p = do{ x <- p; spaces; return x }<br />
symbol name = lexeme (string name)<br />
parens p = between (symbol "(") (symbol ")") p<br />
<br />
expr :: CharParser st Expr<br />
expr = term `chainl1` addop<br />
<br />
term :: CharParser st Expr<br />
term = factor `chainl1` mulop<br />
<br />
factor :: CharParser st Expr<br />
factor = parens expr <|> integer <|> try antiIntExpr <|> antiExpr<br />
<br />
mulop = do{ symbol "*"; return $ BinopExpr MulOp }<br />
<|> do{ symbol "/"; return $ BinopExpr DivOp }<br />
<br />
addop = do{ symbol "+"; return $ BinopExpr AddOp }<br />
<|> do{ symbol "-"; return $ BinopExpr SubOp }<br />
<br />
integer :: CharParser st Expr<br />
integer = lexeme $ do{ ds <- many1 digit ; return $ IntExpr (read ds) }<br />
<br />
ident :: CharParser s String<br />
ident = do{ c <- small; cs <- many idchar; return (c:cs) }<br />
<br />
antiIntExpr = lexeme $ do{ symbol "$int:"; id <- ident; return $ AntiIntExpr id }<br />
antiExpr = lexeme $ do{ symbol "$"; id <- ident; return $ AntiExpr id }<br />
</haskell><br />
<br />
The helper function parseExpr takes a source code position (consisting of a file<br />
name, line and column) and a string and returns a value of type Expr. This<br />
helper function also ensures that we can parse the whole string rather than just<br />
a prefix.<br />
<br />
<haskell><br />
parseExpr :: Monad m => (String, Int, Int) -> String -> m Expr<br />
parseExpr (file, line, col) s =<br />
case runParser p () "" s of<br />
Left err -> fail $ show err<br />
Right e -> return e<br />
where<br />
p = do pos <- getPosition<br />
setPosition $<br />
(flip setSourceName) file $<br />
(flip setSourceLine) line $<br />
(flip setSourceColumn) col $<br />
pos<br />
spaces<br />
e <- expr<br />
eof<br />
return e<br />
</haskell><br />
<br />
= The Quasiquoter =<br />
<br />
Remember, our quasiquoter allows us to write expression in our simple language,<br />
such as [$expr|2 * 3|], directly in Haskell source code. This requires that the<br />
variable expr be in-scope when the quasiquote is encountered, and that it is<br />
bound to a value of type Language.Haskell.TH.Quote.QuasiQuoter, which contains<br />
an expression quoter and a pattern quoter. Note that expr must obey the same<br />
stage restrictions as Template Haskell; in particular, it may not be defined in<br />
the same module where it is used as a quasiquoter, but must be imported.<br />
<br />
Our expression and pattern quoters are quoteExprExp and quoteExprPat,<br />
respectively, so our quasiquoter expr is written as follows:<br />
<br />
<haskell><br />
quoteExprExp :: String -> TH.ExpQ<br />
quoteExprPat :: String -> TH.PatQ<br />
<br />
expr :: QuasiQuoter<br />
expr = QuasiQuoter quoteExprExp quoteExprPat<br />
</haskell><br />
<br />
Our quasiquoters re-use the parser we wrote in the previous section, parseExpr,<br />
and make use of the generic functions dataToExpQ and dataToPatQ (described in<br />
the Haskell Workshop paper). These functions, from the Language.Haskell.TH.Quote<br />
package, take a Haskell value and reflect it back into the language as Template<br />
Haskell abstract syntax. The catch is that we don't want to handle all values<br />
generically: antiquoted values must be handled specially. Consider the AntiExpr<br />
constructor; we don't want this constructor to be mapped to Template Haskell<br />
abstract syntax for the AntiExpr constructor, but to abstract syntax for the<br />
Haskell variable named by the constructor's argument. The extQ combinator allows<br />
us to do this nicely by defining a function antiExprExp that handles<br />
antiquotations.<br />
<br />
<haskell><br />
quoteExprExp s = do loc <- TH.location<br />
let pos = (TH.loc_filename loc,<br />
fst (TH.loc_start loc),<br />
snd (TH.loc_start loc))<br />
expr <- parseExpr pos s<br />
dataToExpQ (const Nothing `extQ` antiExprExp) expr<br />
<br />
antiExprExp :: Expr -> Maybe (TH.Q TH.Exp)<br />
antiExprExp (AntiIntExpr v) = Just $ TH.appE (TH.conE (TH.mkName "IntExpr"))<br />
(TH.varE (TH.mkName v))<br />
antiExprExp (AntiExpr v) = Just $ TH.varE (TH.mkName v)<br />
antiExprExp _ = Nothing<br />
</haskell><br />
<br />
The corresponding code for patterns is:<br />
<br />
<haskell><br />
quoteExprPat s = do loc <- TH.location<br />
let pos = (TH.loc_filename loc,<br />
fst (TH.loc_start loc),<br />
snd (TH.loc_start loc))<br />
expr <- parseExpr pos s<br />
dataToPatQ (const Nothing `extQ` antiExprPat) expr<br />
<br />
antiExprPat :: Expr -> Maybe (TH.Q TH.Pat)<br />
antiExprPat (AntiIntExpr v) = Just $ TH.conP (TH.mkName "IntExpr")<br />
[TH.varP (TH.mkName v)]<br />
antiExprPat (AntiExpr v) = Just $ TH.varP (TH.mkName v)<br />
antiExprPat _ = Nothing<br />
</haskell><br />
<br />
= Examples =<br />
<br />
We can now try out a few examples by invoking ghci as follows: <code>ghci -XQuasiQuotes Expr/Quote</code><br />
<br />
<pre><br />
> [$expr|1 + 3 + 5|]<br />
BinopExpr AddOp (BinopExpr AddOp (IntExpr 1) (IntExpr 3)) (IntExpr 5) <br />
> eval [$expr|1 + 3 + 5|]<br />
9 <br />
</pre><br />
<br />
Taking advantage of our quasiquoter, we can re-write our evaluator so it uses<br />
concrete syntax:<br />
<br />
<haskell><br />
eval' :: Expr -> Integer<br />
eval' [$expr|$int:x|] = x<br />
eval' [$expr|$x + $y|] = eval' x + eval' y<br />
eval' [$expr|$x - $y|] = eval' x - eval' y<br />
eval' [$expr|$x * $y|] = eval' x * eval' y<br />
eval' [$expr|$x / $y|] = eval' x `div` eval' y<br />
</haskell><br />
<br />
Let's make sure it works as advertised:<br />
<br />
<pre><br />
> eval [$expr|1 + 2 + 3|] == eval' [$expr|1 + 2 + 3|]<br />
True <br />
> eval [$expr|1 + 3 * 5|] == eval' [$expr|1 + 3 * 5|]<br />
True <br />
</pre></div>MartijnVanSteenbergenhttps://wiki.haskell.org/Template:Main/EventsTemplate:Main/Events2010-10-01T10:14:08Z<p>MartijnVanSteenbergen: removed past events</p>
<hr />
<div>=== Events ===<br />
{| border="0" cellspacing="3" cellpadding="2"<br />
! <br />
!<br />
!<br />
|-<br />
| [http://haskell.org/haskellwiki/HaskellImplementorsWorkshop/2010 Haskell Implementors Workshop]<br />
| Baltimore/MD<br />
| October 1, 2010<br />
|-<br />
| [http://cufp.org/conference Commercial Users of Functional Programming]<br />
| Baltimore/MD<br />
| October 1-2, 2010<br />
|-<br />
| [http://www.haskell.org/haskellwiki/Ghent_Functional_Programming_Group/BelHac BelHac]<br />
| Ghent, Belgium<br />
| November 5-7, 2010<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Ghent_Functional_Programming_Group/BelHacGhent Functional Programming Group/BelHac2010-09-09T07:20:56Z<p>MartijnVanSteenbergen: typo</p>
<hr />
<div>== About ==<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure.<br />
<br />
BelHac will be held on 5-7 November 2010 in "The Therminal" in Ghent, Belgium. It is open to all -- you do not have to be a Haskell guru to attend. All you need is a basic knowledge of Haskell, a willingness to learn, and a project you're excited to help with (or a project of your own to work on).<br />
<br />
There will be lots of hacking, good beer, and, of course, fun! <br />
<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC channel: #ghentfpg on FreeNode<br />
<br />
You can [[/Register|register here]].<br />
<br />
== News ==<br />
<br />
* July 29: Added a [[/Projects|projects page]]<br />
* July 20: [[/Register|Registration]] is now open!<br />
<br />
== When ==<br />
<br />
* Friday, 5th of November: 2pm - 7pm<br />
* Saturday, 6th of November: 10am - 6pm<br />
* Sunday, 7th of November: 10am - 6pm<br />
<br />
=== Program ===<br />
<br />
* Friday: short introduction, followed by hacking and sponsored food. There will also be a "Real World Haskell Crash Course" for unexperienced but interested people.<br />
* Saturday: Hacking!<br />
* Sunday: More hacking, and in the afternoon we will have a couple of (lightning) talks.<br />
<br />
If you'd like to work on a specific project, please consider adding it to the [[/Projects|projects page]] if it is not on there already. Otherwise, add yourself to the list of people who will hack on said project. <br />
<br />
== Getting there ==<br />
<br />
=== Getting to Ghent ===<br />
<br />
The nearest airport is the Brussels Airport in Zaventem (code: BRU). The train station connected to this airport has an excellent connection with Ghent (Gent in Dutch). The train schedule is pretty regular and should be more or less the same through the entire day after 9:00 AM -- pending accidents, delays, etc. So just replace the 'hour' of the ride with the hour at which you'll arrive at the train station and you're set. For example, for train reaching Ghent prior to 10AM, the schedule looks as follows.<br />
<br />
{| class="wikitable"<br />
! Time of departure<br />
! Time of arrival<br />
! Change trains at<br />
|-<br />
| 7:27 (dir. Nijvel)<br />
| 8:36<br />
| Brussel-Noord (dir. Oostende)<br />
|- <br />
| 7:52 (dir. De Panne)<br />
| 8:45<br />
|<br />
|-<br />
| 8:10 (dir. Gent, stops everywhere!)<br />
| 9:35<br />
| Brussel-Noord (dir. St.-Niklaas); Dendermonde (dir. Brugge)<br />
|-<br />
| 8:36 (dir. Quevy)<br />
| 9:36 <br />
| Brussel-Noord (dir. Oostende)<br />
|- <br />
| 8:52 (dir. De Panne)<br />
| 9:45<br />
|<br />
|}<br />
<br />
Basically, unless the train leaving at the airport is an IC or IR type connected to Ghent and beyond, you are best of when changing trains in Brussels (station Brussel-Noord (North)). There you are best off taking the IC train to either Oostende or Knokke/Blankenberge. In both cases, Ghent St.-Pieters is the first stop after Brussel-Zuid (South) or Bruxelles-Midi (in French), i.e., the third stop if you change train at Brussel-Noord. <br />
<br />
=== Getting to The Therminal ===<br />
<br />
The address of The Therminal is<br />
<br />
Hoveniersberg 24<br />
9000 Gent<br />
Belgium<br />
<br />
Here is [http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=24+Hoveniersberg,+Gent,+Vlaams+Gewest,+Belgi%C3%AB&sll=37.0625,-95.677068&sspn=38.22949,78.662109&ie=UTF8&hq=&hnear=Hoveniersberg+24,+Gent+9000+Gent,+Oost-Vlaanderen,+Vlaams+Gewest,+Belgium&t=h&z=16 a map]<br />
<br />
== Food ==<br />
<br />
Here is a [http://maps.google.com/maps/ms?hl=en&ie=UTF8&msa=0&msid=103149869785604317946.00048bcfacdc6e03545df&t=h&z=14 map of handy locations].<br />
<br />
== Accommodation ==<br />
<br />
Since Ghent is quite a tourist city, you should have no problems finding a place to stay.<br />
<br />
Some pointers:<br />
* [http://www.vjh.be/jeugdherbergen/gent/ De Draecke], a youth hostel in the center of Ghent.<br />
* [http://www.ibishotel.com/gb/hotel-0961-ibis-gent-centrum-st-baafs-kathedraal/index.shtml IBIS St.-Baafs], a 2-star hotel in the center of Ghent.<br />
* [http://www.ibishotel.com/gb/hotel-1455-ibis-gent-centrum-opera/location.shtml IBIS Opera], a 2-star hotel in the center of Ghent.<br />
* [http://book.bestwestern.com/bestwestern/productInfo.do?propertyCode=92615 Best Western Chamade], a 3-star hotel near Ghent St.-Pieters train station.<br />
* [http://www.monasterium.be/ Monasterium hotel], a 3-star hotel in the center of Ghent, in a fully refurbished building dating back to 1278. <br />
* [http://www.nh-hotels.com/nh/en/hotels/belgium/ghent/nh-gent-belfort.html NH Gent Belfort], a 4-star hotel in the center of Ghent.<br />
* [http://www.marriott.com/hotels/travel/gnemc-ghent-marriott-hotel/ Ghent Marriott], a 4-star hotel in the center of Ghent.<br />
* [http://www.visitgent.be/eCache/VGG/3/114.dmdfbGFuZz1FTg.html Visit Ghent], the Ghent tourist board.<br />
<br />
== What to bring ==<br />
<br />
* A laptop with a wireless card. Ethernet access might be available, but don't count on it. If you really need ethernet access, contact the organizers.<br />
* There is a projector available if someone wants to give a talk.<br />
<br />
== Sponsors ==<br />
<br />
[[Image:Well-typed.png]]<br />
<br />
BelHac is sponsored by [http://well-typed.com Well-Typed, The Haskell Consultants].<br />
<br />
We're still looking for sponsors to help us provide food, drinks and t-shirts. If you or your company are interested in sponsoring, please contact one of the organizers.<br />
<br />
== Organizers & Contact ==<br />
<br />
The GhentFPG organizing committee is behind this Hackaton. You can contact us at<br />
<br />
* Jasper Van der Jeugt (irc: jaspervdj, email: jaspervdj+belhac@gmail.com, phone: +32-476-26-28-27)</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Ghent_Functional_Programming_Group/BelHacGhent Functional Programming Group/BelHac2010-09-09T07:20:36Z<p>MartijnVanSteenbergen: added precise date to the paragraph that Google shows in its search results for "BelHac"</p>
<hr />
<div>== About ==<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure.<br />
<br />
BelHac will be held in 5-7 November 2010 in "The Therminal" in Ghent, Belgium. It is open to all -- you do not have to be a Haskell guru to attend. All you need is a basic knowledge of Haskell, a willingness to learn, and a project you're excited to help with (or a project of your own to work on).<br />
<br />
There will be lots of hacking, good beer, and, of course, fun! <br />
<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC channel: #ghentfpg on FreeNode<br />
<br />
You can [[/Register|register here]].<br />
<br />
== News ==<br />
<br />
* July 29: Added a [[/Projects|projects page]]<br />
* July 20: [[/Register|Registration]] is now open!<br />
<br />
== When ==<br />
<br />
* Friday, 5th of November: 2pm - 7pm<br />
* Saturday, 6th of November: 10am - 6pm<br />
* Sunday, 7th of November: 10am - 6pm<br />
<br />
=== Program ===<br />
<br />
* Friday: short introduction, followed by hacking and sponsored food. There will also be a "Real World Haskell Crash Course" for unexperienced but interested people.<br />
* Saturday: Hacking!<br />
* Sunday: More hacking, and in the afternoon we will have a couple of (lightning) talks.<br />
<br />
If you'd like to work on a specific project, please consider adding it to the [[/Projects|projects page]] if it is not on there already. Otherwise, add yourself to the list of people who will hack on said project. <br />
<br />
== Getting there ==<br />
<br />
=== Getting to Ghent ===<br />
<br />
The nearest airport is the Brussels Airport in Zaventem (code: BRU). The train station connected to this airport has an excellent connection with Ghent (Gent in Dutch). The train schedule is pretty regular and should be more or less the same through the entire day after 9:00 AM -- pending accidents, delays, etc. So just replace the 'hour' of the ride with the hour at which you'll arrive at the train station and you're set. For example, for train reaching Ghent prior to 10AM, the schedule looks as follows.<br />
<br />
{| class="wikitable"<br />
! Time of departure<br />
! Time of arrival<br />
! Change trains at<br />
|-<br />
| 7:27 (dir. Nijvel)<br />
| 8:36<br />
| Brussel-Noord (dir. Oostende)<br />
|- <br />
| 7:52 (dir. De Panne)<br />
| 8:45<br />
|<br />
|-<br />
| 8:10 (dir. Gent, stops everywhere!)<br />
| 9:35<br />
| Brussel-Noord (dir. St.-Niklaas); Dendermonde (dir. Brugge)<br />
|-<br />
| 8:36 (dir. Quevy)<br />
| 9:36 <br />
| Brussel-Noord (dir. Oostende)<br />
|- <br />
| 8:52 (dir. De Panne)<br />
| 9:45<br />
|<br />
|}<br />
<br />
Basically, unless the train leaving at the airport is an IC or IR type connected to Ghent and beyond, you are best of when changing trains in Brussels (station Brussel-Noord (North)). There you are best off taking the IC train to either Oostende or Knokke/Blankenberge. In both cases, Ghent St.-Pieters is the first stop after Brussel-Zuid (South) or Bruxelles-Midi (in French), i.e., the third stop if you change train at Brussel-Noord. <br />
<br />
=== Getting to The Therminal ===<br />
<br />
The address of The Therminal is<br />
<br />
Hoveniersberg 24<br />
9000 Gent<br />
Belgium<br />
<br />
Here is [http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=24+Hoveniersberg,+Gent,+Vlaams+Gewest,+Belgi%C3%AB&sll=37.0625,-95.677068&sspn=38.22949,78.662109&ie=UTF8&hq=&hnear=Hoveniersberg+24,+Gent+9000+Gent,+Oost-Vlaanderen,+Vlaams+Gewest,+Belgium&t=h&z=16 a map]<br />
<br />
== Food ==<br />
<br />
Here is a [http://maps.google.com/maps/ms?hl=en&ie=UTF8&msa=0&msid=103149869785604317946.00048bcfacdc6e03545df&t=h&z=14 map of handy locations].<br />
<br />
== Accommodation ==<br />
<br />
Since Ghent is quite a tourist city, you should have no problems finding a place to stay.<br />
<br />
Some pointers:<br />
* [http://www.vjh.be/jeugdherbergen/gent/ De Draecke], a youth hostel in the center of Ghent.<br />
* [http://www.ibishotel.com/gb/hotel-0961-ibis-gent-centrum-st-baafs-kathedraal/index.shtml IBIS St.-Baafs], a 2-star hotel in the center of Ghent.<br />
* [http://www.ibishotel.com/gb/hotel-1455-ibis-gent-centrum-opera/location.shtml IBIS Opera], a 2-star hotel in the center of Ghent.<br />
* [http://book.bestwestern.com/bestwestern/productInfo.do?propertyCode=92615 Best Western Chamade], a 3-star hotel near Ghent St.-Pieters train station.<br />
* [http://www.monasterium.be/ Monasterium hotel], a 3-star hotel in the center of Ghent, in a fully refurbished building dating back to 1278. <br />
* [http://www.nh-hotels.com/nh/en/hotels/belgium/ghent/nh-gent-belfort.html NH Gent Belfort], a 4-star hotel in the center of Ghent.<br />
* [http://www.marriott.com/hotels/travel/gnemc-ghent-marriott-hotel/ Ghent Marriott], a 4-star hotel in the center of Ghent.<br />
* [http://www.visitgent.be/eCache/VGG/3/114.dmdfbGFuZz1FTg.html Visit Ghent], the Ghent tourist board.<br />
<br />
== What to bring ==<br />
<br />
* A laptop with a wireless card. Ethernet access might be available, but don't count on it. If you really need ethernet access, contact the organizers.<br />
* There is a projector available if someone wants to give a talk.<br />
<br />
== Sponsors ==<br />
<br />
[[Image:Well-typed.png]]<br />
<br />
BelHac is sponsored by [http://well-typed.com Well-Typed, The Haskell Consultants].<br />
<br />
We're still looking for sponsors to help us provide food, drinks and t-shirts. If you or your company are interested in sponsoring, please contact one of the organizers.<br />
<br />
== Organizers & Contact ==<br />
<br />
The GhentFPG organizing committee is behind this Hackaton. You can contact us at<br />
<br />
* Jasper Van der Jeugt (irc: jaspervdj, email: jaspervdj+belhac@gmail.com, phone: +32-476-26-28-27)</div>MartijnVanSteenbergenhttps://wiki.haskell.org/MonadMonad2010-08-02T07:48:10Z<p>MartijnVanSteenbergen: fixed link to Identity Monad</p>
<hr />
<div>{{Standard class|Monad|module=Control.Monad|module-doc=Control-Monad|package=base}}<br />
<br />
'''''Monads''''' in Haskell can be thought of as ''composable'' computation descriptions. The essence of monad is thus ''separation'' of ''composition timeline'' from the composed computation's ''execution timeline'', as well as the ability of ''computation'' to implicitly carry extra data as pertaining to the computation itself in addition to its ''one'' (hence the name) output. This lends monads to supplementing ''pure'' calculations with features like I/O, common environment or state, and to ''preprocessing'' of computations (simplification, optimization etc.). <br />
<br />
Each monad, or computation type, provides means, subject to '''''Monad Laws''''', of (a) creating a description of computation to produce a ''given value'' (or such that will ''fail'' to produce anything at all), (b) ''running'' a computation description (CD) and returning its output to Haskell, and (c) combining a CD with a Haskell function consuming of its output and returning another CD (using or dependent on that output, if need be), to create a ''combined'' CD. It might also define additional primitives to provide access and/or enable manipulation of data it implicitly carries, specific to its nature.<br />
<br />
Thus in Haskell, though it is a purely-functional language, side effects that '''''will be performed''''' by a computation can be dealt with and combined ''purely'' at the monad's composition time. Monads thus resemble programs in a particular [[DSL]]. While programs may describe impure effects and actions ''outside'' Haskell, they can still be combined and processed (''"compiled"'') purely, ''inside'' Haskell, creating a pure Haskell value - a CD that describes an impure calculation. That is how Monads in Haskell '''''separate''''' between the ''pure'' and the ''impure''. The combined computations don't have to be impure and can be pure themselves as well. Then Monads serve to separate the pure from the pure in one big holiday celebration after the other.<br />
<br />
Because they are very useful in practice but rather mind-twisting for the beginners, numerous tutorials that deal exclusively with monads were created (see [[Monad#Monad tutorials|monad tutorials]]).<br />
<br />
== Common monads ==<br />
Most common applications of monads include:<br />
* Representing failure using <hask>Maybe</hask> monad<br />
* Nondeterminism through backtracking using <hask>List</hask> monad<br />
* State using <hask>State</hask> monad<br />
* Read-only environment using <hask>Reader</hask> monad<br />
* I/O using <hask>IO</hask> monad<br />
<br />
== Monad class ==<br />
<br />
Monads can be viewed as a standard programming interface to various data or control structures, which is captured by the <hask>Monad</hask> class. All common monads are members of it:<br />
<br />
<haskell><br />
class Monad m where<br />
(>>=) :: m a -> (a -> m b) -> m b<br />
(>>) :: m a -> m b -> m b<br />
return :: a -> m a<br />
fail :: String -> m a<br />
</haskell><br />
<br />
In addition to implementing the class functions, all instances of Monad should obey the following equations, or '''''Monad Laws''''':<br />
<br />
<haskell><br />
return a >>= k = k a<br />
m >>= return = m<br />
m >>= (\x -> k x >>= h) = (m >>= k) >>= h<br />
</haskell><br />
<br />
See [[Monad laws|this intuitive explanation]] of why they should obey the Monad laws.<br />
<br />
Any Monad can be made a [[Functor]] by defining <br />
<br />
<haskell><br />
fmap ab ma = ma >>= (return . ab)<br />
</haskell><br />
<br />
However, the Functor class is not a superclass of the Monad class. See [[Functor hierarchy proposal]].<br />
<br />
== Special notation ==<br />
<br />
In order to improve the look of code that uses monads Haskell provides a special [[syntactic sugar]] called <hask>do</hask>-notation. For example, following expression:<br />
<haskell><br />
thing1 >>= (\x -> func1 x >>= (\y -> thing2 >>= (\_ -> func2 y (\z -> return z))))<br />
</haskell><br />
which can be written more clearly by breaking it into several lines and omitting parentheses:<br />
<haskell><br />
thing1 >>= \x -><br />
func1 x >>= \y -><br />
thing2 >>= \_ -><br />
func2 y >>= \z -><br />
return z<br />
</haskell><br />
can be also written using the <hask>do</hask>-notation as follows:<br />
<haskell><br />
do<br />
x <- thing1<br />
y <- func1 x<br />
thing2<br />
z <- func2 y<br />
return z<br />
</haskell><br />
Code written using the <hask>do</hask>-notation is transformed by the compiler to ordinary expressions that use <hask>Monad</hask> class functions.<br />
<br />
When using the <hask>do</hask>-notation and a monad like <hask>State</hask> or <hask>IO</hask> programs look very much like programs written in an imperative language as each line contains a statement that can change the simulated global state of the program and optionally binds a (local) variable that can be used by the statements later in the code block.<br />
<br />
It is possible to intermix the <hask>do</hask>-notation with regular notation.<br />
<br />
More on the <hask>do</hask>-notation can be found in a section of [[Monads as computation#Do notation|Monads as computation]] and in other [[Monad#Monad tutorials|tutorials]].<br />
<br />
== Commutative monads ==<br />
'''Commutative monads''' are monads for which the order of actions makes no difference (they '''commute'''), that is when following code:<br />
<haskell><br />
do<br />
a <- f x<br />
b <- g y<br />
m a b<br />
</haskell><br />
is the same as:<br />
<haskell><br />
do<br />
b <- g y<br />
a <- f x<br />
m a b<br />
</haskell><br />
<br />
Examples of commutative include:<br />
* <hask>Reader</hask> monad<br />
* <hask>Maybe</hask> monad<br />
<br />
== Monad tutorials ==<br />
<br />
Monads are known for being deeply confusing to lots of people, so there are plenty of tutorials specifically related to monads. Each takes a different approach to Monads, and hopefully everyone will find something useful.<br />
<br />
See [[Tutorials#Using_monads|Monad tutorials]].<br />
<br />
== Monad reference guides ==<br />
<br />
An explanation of the basic Monad functions, with examples, can be found in the reference guide [http://members.chello.nl/hjgtuyl/tourdemonad.html A tour of the Haskell Monad functions], by Henk-Jan van Tuyl.<br />
<br />
== Monad research ==<br />
<br />
A collection of [[Research_papers/Monads_and_arrows|research papers]] about monads.<br />
<br />
== Monads in other languages ==<br />
<br />
Implementations of monads in other languages.<br />
<br />
* [http://programming.reddit.com/goto?id=1761q C]<br />
* [http://www-static.cc.gatech.edu/~yannis/fc++/FC++.1.5/monad.h C++], [http://www-static.cc.gatech.edu/~yannis/fc++/New1.5/lambda.html#monad doc]<br />
* [http://cml.cs.uchicago.edu/pages/cml.html CML.event] ?<br />
* [http://clean.cs.ru.nl/Download/Download_Libraries/Std_Env/StdFunc/stdfunc.html Clean] State monad<br />
* [http://clojure.googlegroups.com/web/monads.clj Clojure]<br />
* [http://cratylus.freewebspace.com/monads-in-javascript.htm JavaScript]<br />
* [http://www.ccs.neu.edu/home/dherman/code/monads/JavaMonads.tar.gz Java] (tar.gz)<br />
* [http://permalink.gmane.org/gmane.comp.lang.concatenative/1506 Joy]<br />
* [http://research.microsoft.com/~emeijer/Papers/XLinq%20XML%20Programming%20Refactored%20(The%20Return%20Of%20The%20Monoids).htm LINQ], [http://www.idealliance.org/xmlusa/05/call/xmlpapers/63.1015/.63.html#S4. more, C#, VB]<br />
* [http://sleepingsquirrel.org/monads/monads.lisp Lisp]<br />
* [http://lambda-the-ultimate.org/node/1136#comment-12448 Miranda]<br />
* OCaml:<br />
** [http://www.cas.mcmaster.ca/~carette/pa_monad/ OCaml]<br />
** [https://mailman.rice.edu/pipermail/metaocaml-users-l/2005-March/000057.html more]<br />
** [http://www.pps.jussieu.fr/~beffara/darcs/pivm/caml-vm/monad.mli also]<br />
** [http://www.cas.mcmaster.ca/~carette/metamonads/ MetaOcaml]<br />
** [http://enfranchisedmind.com/blog/archive/2007/08/06/307 A Monad Tutorial for Ocaml]<br />
* [http://sleepingsquirrel.org/monads/monads.html Perl]<br />
* [http://programming.reddit.com/info/p66e/comments Perl6 ?]<br />
* [http://logic.csci.unt.edu/tarau/research/PapersHTML/monadic.html Prolog] <br />
* Python<br />
** [http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/439361 Python]<br />
** [http://www.etsimo.uniovi.es/python/pycon/papers/deferex/ here]<br />
** Twisted's [http://programming.reddit.com/info/p66e/comments/cp8eh Deferred monad]<br />
* Ruby:<br />
** [http://moonbase.rydia.net/mental/writings/programming/monads-in-ruby/00introduction.html Ruby]<br />
** [http://meta-meta.blogspot.com/2006/12/monads-in-ruby-part-1-identity.htmland other implementation]<br />
* Scala: <br />
** [http://scala.epfl.ch/examples/files/simpleInterpreter.html Scala]<br />
** [http://scala.epfl.ch/examples/files/callccInterpreter.html A continuation monad]<br />
* Scheme:<br />
** [http://okmij.org/ftp/Scheme/monad-in-Scheme.html Scheme]<br />
** [http://www.ccs.neu.edu/home/dherman/research/tutorials/monads-for-schemers.txt also]<br />
* [http://wiki.tcl.tk/13844 Tcl]<br />
* [http://okmij.org/ftp/Computation/monadic-shell.html The Unix Shell]<br />
* [http://okmij.org/ftp/Computation/monads.html More monads by Oleg]<br />
* [http://lambda-the-ultimate.org/node/2322 CLL]: a concurrent language based on a first-order intuitionistic linear logic where all right synchronous connectives are restricted to a monad. <br />
<br />
Unfinished:<br />
<br />
* [http://slate.tunes.org/repos/main/src/unfinished/monad.slate Slate]<br />
* [http://wiki.tcl.tk/14295 Parsing], [http://wiki.tcl.tk/13844 Maybe and Error] in Tcl<br />
<br />
And possibly there exist:<br />
<br />
* Standard ML (via modules?)<br />
<br />
Please add them if you know of other implementations.<br />
<br />
[http://lambda-the-ultimate.org/node/1136 Collection of links to monad implementations in various languages.] on [http://lambda-the-ultimate/ Lambda The Ultimate].<br />
<br />
==Interesting monads==<br />
<br />
A list of monads for various evaluation strategies and games:<br />
<br />
* [http://hackage.haskell.org/packages/archive/mtl/1.1.0.2/doc/html/Control-Monad-Identity.html Identity monad]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Maybe.html Optional results]<br />
* [http://haskell.org/haskellwiki/New_monads/MonadRandom Random values]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Reader.html Read only state]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Writer.html Writable state]<br />
* [http://haskell.org/haskellwiki/New_monads/MonadSupply Unique supply]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-ST.html ST - memory-only effects]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-State.html Global state]<br />
* [http://haskell.org/haskellwiki/New_monads/MonadUndo Undoable state effects]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-Instances.html Function application]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Error.html Functions which may error]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/stm/Control-Monad-STM.html Atomic memory transactions]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Cont.html Continuations]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/base/System-IO.html#t%3AIO IO - unrestricted side effects]<br />
* [http://www.haskell.org/haskellwiki/Sudoku Non-deterministic evaluation]<br />
* [http://haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-List.html List monad: computations with multiple choices]<br />
* [http://www.math.chalmers.se/~koen/pubs/entry-jfp99-monad.html Concurrent threads]<br />
* [http://logic.csci.unt.edu/tarau/research/PapersHTML/monadic.html Backtracking computations]<br />
* [http://www.cs.cornell.edu/people/fluet/research/rgn-monad/index.html Region allocation effects]<br />
* [http://okmij.org/ftp/Computation/monads.html#LogicT LogicT: backtracking monad transformer with fair operations and pruning]<br />
* [http://tsukimi.agusa.i.is.nagoya-u.ac.jp/~sydney/PiMonad/ Pi calculus as a monad]<br />
* [http://www.haskell.org/halfs/ Halfs], uses a read-only and write-only monad for filesystem work.<br />
* House's H monad for safe hardware access<br />
* [http://www-fp.dcs.st-and.ac.uk/~kh/papers/pasco94/subsubsectionstar3_3_2_3.html Commutable monads for parallel programming]<br />
* [http://hackage.haskell.org/package/QIO The Quantum computing monad]<br />
* [http://hackage.haskell.org/package/stream-monad Simple, Fair and Terminating Backtracking Monad]<br />
* [http://hackage.haskell.org/package/control-monad-exception Typed exceptions with call traces as a monad]<br />
* [http://hackage.haskell.org/package/control-monad-omega Breadth first list monad]<br />
* [http://hackage.haskell.org/package/control-monad-queue Continuation-based queues as monads]<br />
* [http://hackage.haskell.org/package/full-sessions Typed network protocol monad]<br />
* [http://hackage.haskell.org/package/level-monad Non-Determinism Monad for Level-Wise Search]<br />
* [http://hackage.haskell.org/package/monad-tx Transactional state monad]<br />
* [http://hackage.haskell.org/package/monadiccp A constraint programming monad]<br />
* [http://hackage.haskell.org/package/ProbabilityMonads A probability distribution monad]<br />
<br />
<br />
There are many more interesting instance of the monad abstraction out there. Please add them as you come across each species.<br />
<br />
==Fun==<br />
<br />
* If you are tired of monads, you can easily [http://saxophone.jpberlin.de/MonadTransformer?source=http%3A%2F%2Fwww%2Ehaskell%2Eorg%2Fhaskellwiki%2FCategory%3AMonad&language=English get rid of them].<br />
<br />
[[Category:Monad|*]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/ZuriHac2010/AccommodationsZuriHac2010/Accommodations2010-03-19T07:48:18Z<p>MartijnVanSteenbergen: added Utrechters</p>
<hr />
<div>This is the accomodation page for [[ZuriHac]]. Please refer to the [[ZuriHac|main page]] for more information.<br />
<br />
Please use this page to organize where you are going to stay.<br />
<br />
{| class="wikitable"<br />
! Names<br />
! Staying At<br />
! Further Information<br />
|-<br />
| Joachim Breitner, Martin Kiefel<br />
| City Backpacker<br />
| Looking for up to four people to share a room.<br />
|- <br />
| Roman Cheplyaka<br />
| City Backpacker<br />
| Room 204<br />
|- <br />
| Jasper Van der Jeugt<br />
| City Backpacker<br />
| Room 404<br />
|-<br />
| Benedikt Huber, David Markvica<br />
| City Backpacker<br />
| Room 201<br />
|-<br />
| Sergey Astanin<br />
| City Backpacker<br />
|<br />
|-<br />
| Marc A. Ziegert<br />
| Youth Hostel<br />
|<br />
|-<br />
| Tom Harper, Jim Whitehead <br />
| City Backpacker<br />
|<br />
|-<br />
| Oliver Mueller <br />
| City Backpacker<br />
|<br />
|-<br />
| Erik, Chris, Sjoerd, Sebas, Tom, Martijn<br />
| City Backpacker<br />
| Room 203<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/ZuriHac2010/ProjectsZuriHac2010/Projects2010-03-15T10:50:37Z<p>MartijnVanSteenbergen: added Sirenial project</p>
<hr />
<div>== Generic information ==<br />
<br />
You can apply for an account and a project using<br />
[http://community.haskell.org/admin/ the community server].<br />
<br />
Once you have an account and/or a project, you upload a Darcs repository as follows. First, initialize your repository on the server:<br />
<br />
$ ssh community.haskell.org<br />
you@haskell:~$ cd /srv/code/yourproject<br />
you@haskell:/srv/code/yourproject$ darcs init<br />
<br />
Then, log out and push your repository:<br />
<br />
$ darcs push community.haskell.org:/srv/code/yourproject<br />
<br />
== Projects ==<br />
<br />
If you have a project that you want to work on at the Hackathon, please describe it here.<br />
<br />
Since Hackathons are great for teamwork, consider joining one of the projects mentioned below. If you're interested in one of these projects, add your name to the list of hackers under that project.<br />
<!-- Copy this template<br />
=== Project name ===<br />
<br />
I am a project. Love me.<br />
<br />
Hackers: Hacker 1, Hacker 2<br />
--><br />
<br />
=== Darcs ===<br />
<br />
A large chunk of the Darcs team will be at ZuriHac. We would be delighted for you to join in and do some hacking with us. To help you get started, we have a big list of ProbablyEasy bugs to chew on. See our [http://wiki.darcs.net/Sprints/2010-03 sprint page] for more details!<br />
<br />
Hackers: Florent Becker, Guillaume Hoffmann, Eric Kow, Reinier Lamers, Petr Rockai, Ganesh Sittampalam and more...<br />
<br />
=== Need for speed ===<br />
<br />
In 2006 the Python community had a [http://wiki.python.org/moin/NeedForSpeed NeedForSpeed sprint]. Some Haskell libraries, like the containers library, could use some benchmarks (using e.g. [http://hackage.haskell.org/package/criterion Criterion]) and hopefully some performance improvements.<br />
<br />
=== event ===<br />
<br />
The [http://github.com/tibbe/event event library] will hopefully replace GHC's I/O manager with a more scalable implementation, based on better data structures and more efficient system calls (e.g. epoll/kqueue).<br />
<br />
The project is nearing completion, but more testing and benchmarking is needed. The code also needs to be merged into GHC.<br />
<br />
Hackers: Johan Tibell<br />
<br />
=== Data.Binary on continuations ===<br />
<br />
The [http://code.haskell.org/binary/ Data.Binary library] provides blazing fast reading/writing of binary data. There are a few things I'd like to see improved, hopefully before inclusion in the [http://hackage.haskell.org/platform/ Haskell Platform]:<br />
<br />
* It's not possible to use the library on large inputs without resorting to lazy I/O. By changing the underlying implementation to use continuations and expose a continuations based API we can process large inputs without resorting to unsafe operations. This needs to be done while still offering good performance.<br />
* The library lacks error handling. The above implementation would naturally support communicating errors to the user. There are however other ways to achieve the same result.<br />
* The library currently includes two separate features in one package, low-level binary parsing of simple types (e.g. Ints and Words) and a data format (the Binary typeclass). Arguably the library should be split in two.<br />
* The binary data format should be documented and it should be clear which types are guaranteed to have the same encoding for the foreseeable future.<br />
<br />
Hackers: Johan Tibell, Christophe Poucet, Marc A. Ziegert, Lennart Kolmodin<br />
<br />
Comment by Jürgen "Jutaro" Nicklisch: I've hacked an addition package to binary: [http://hackage.haskell.org/package/binary-shared binary-shared], which gives sharing of data for serialization and deserialization. For my app this gives a huge saving of space and time and I think it would be reasonable to integrate this into the binary package. <br />
<br />
<br />
=== Adaptable containers ===<br />
<br />
Scala's collection library was [http://www.scala-lang.org/node/2060 completely overhauled] in 2.8. The [http://hackage.haskell.org/package/containers containers library] is a bit dated. There are several things that could be done:<br />
<br />
* Write a new library based on associate data types, yielding performance improvements.<br />
* Write more tests and add some [http://hackage.haskell.org/package/criterion Criterion] benchmarks.<br />
* Consolidate API naming, exported functions, etc.<br />
<br />
Hackers: Christophe Poucet <br />
<br />
=== Leksah ===<br />
<br />
I will work on Leksah and help is needed and welcome<br />
<br />
* Packaging for Debian/Ubuntu<br />
* Editor for Cabal files with configurations<br />
* Concept for Plugins/Extensions<br />
* Fixing bugs<br />
* ...<br />
<br />
Hackers: Jürgen Nicklisch<br />
<br />
=== arbtt ===<br />
<br />
The automatic rule based time tracker needs some love. Possible projects are <br />
<br />
* Graphical statistics<br />
* Export to hamster db (they have nice statistics)<br />
* More powerful date/time manipulation rules (including type inference and good error messages)<br />
* Performance improvements<br />
* ...<br />
<br />
Hackers: Joachim “nomeata” Breitner<br />
<br />
=== loker ===<br />
<br />
Loker is:<br />
* library for parsing (POSIX) UNIX Shell scripts<br />
* program for static analysis of Shell scripts<br />
* compiler for Shell scripts<br />
* whatever you can imagine related to Shell scripts.<br />
<br />
Currently the parser part is almost done. See [http://github.com/feuerbach/loker githug repository].<br />
<br />
I am happy to see anyone interested in the project, please contact [http://ro-che.info/ me].<br />
<br />
Hackers: Roman Cheplyaka<br />
<br />
=== JPEG-decoder ===<br />
<br />
Package stb-image contains a JPEG-decoding function, but it is a wrapper around a C function. Obviously, it is not the Haskell spirit to let C do the dirty work!<br />
<br />
I once wrote a JPEG-decoder purely in Haskell. It is optimized for readability rather than speed.<br />
During the Hackathon, I want to: <br />
* package it under Cabal<br />
* try and optimize it (using bytestreams (or bitstreams?))<br />
* see whether it competes with the C implementation...<br />
Help of hackers who know bytestreams is appreciated (you don't need knowledge of JPEG to participate in this project).<br />
<br />
Hackers: Jeroen Fokker.<br />
<br />
=== hledger ===<br />
If there are any hledger users among participants, we could hack on it.<br />
First of all, hledger needs some refactoring and API cleaning. Then many nice features could be added.<br />
<br />
Hackers: Roman Cheplyaka<br />
<br />
=== BlazeHtml ===<br />
There are several HTML combinator libraries on hackage, but we still need one that is *really* fast. This is attempt to tackle the problem [http://hackage.haskell.org/trac/summer-of-code/ticket/1580 described here]. A simple API proposal can be found [http://gist.github.com/332603 here], but that's only one idea. Everyone is welcome to hack on this (new) project, if you're interested please contact [http://jaspervdj.be/contact.html me].<br />
<br />
Hackers: Jasper Van der Jeugt, Simon Meier<br />
<br />
=== Pesto ===<br />
I will be working on the Pesto web framework. Rather than a regular framework, it is a collection of orthogonal modules for the model, view and controller part. I will try to release the [http://github.com/chriseidhof/regular-web regular-web] package and possibly work on the [http://github.com/chriseidhof/Basil Basil] library.<br />
<br />
Hackers: Chris Eidhof<br />
<br />
===Sirenial===<br />
[http://code.google.com/p/sirenial/ Sirenial] is a type-safe SQL wrapper. Compared to HaskellDB it uses simpler types and is able to automatically and transparently merge similar SELECT queries. During the Hackathon I will aim to bring the project to a usable state and release a first version on Hackage.<br />
<br />
Hackers: Martijn van Steenbergen<br />
<br />
== Experience ==<br />
<br />
Please list projects with which you are familiar. This way, people know whom to contact for more information or guidance on a particular project.<br />
<br />
{| class="wikitable"<br />
! Name<br />
! Projects<br />
|-<br />
| tibbe<br />
| [http://github.com/tibbe/event event], [http://github.com/tibbe/hyena Hyena], and general networking/HTTP<br />
|-<br />
| chrisdone<br />
| Hacked on/worked on: libgd, hsql, fast/cgi, formlets, json, fdo-notify, mueval, lambdabot, wordcloud, goa, tryhaskell<br />
|-<br />
| coeus<br />
| Network.Socket, binary+cereal; NFSv3 protocol, RS-Codes, have been working with multiple different interacting threads (i.e. combined with single-threaded GUIs, NFS-proxy)<br />
|-<br />
|chriseidhof<br />
| formlets, sphinx, Basil, regular-web, regular, fclabels.<br />
|-<br />
|JedBrown<br />
| distributed memory parallelism, numerical analysis, [http://hackage.haskell.org/package/fft fft]<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/ZuriHac2010/AttendeesZuriHac2010/Attendees2009-12-28T07:24:20Z<p>MartijnVanSteenbergen: added myself to list of attendees</p>
<hr />
<div>This is the attendee list for [[ZuriHac]]. Please refer to the [[ZuriHac|main page]] for more information.<br />
<br />
= Attendees =<br />
<br />
Once you've [[ZuriHac/Register|registered]], please add your name to the following table:<br />
<br />
{| class="wikitable"<br />
! Nickname<br />
! Real Name<br />
! Affiliation<br />
! Mobile #<br />
! Arriving<br />
! Departing<br />
! Accomodation<br />
|-<br />
| coeus<br />
| Marc A. Ziegert<br />
| University of Paderborn<br />
| +49 17 5 6000 700<br />
| <br />
| <br />
| <br />
|-<br />
| Heffalump<br />
| Ganesh Sittampalam<br />
| Credit Suisse<br />
| +447968253467<br />
| <br />
| <br />
| <br />
|-<br />
| tibbe<br />
| Johan Tibell<br />
| Google<br />
| +41787978230<br />
| <br />
| <br />
| <br />
|-<br />
| <br />
| Keith Lomax<br />
| <br />
| <br />
| <br />
| <br />
| <br />
|-<br />
| sioraiocht<br />
| Tom Harper<br />
| Oxford University Computing Laboratory<br />
| +44 7533 998 591<br />
|<br />
|<br />
|<br />
|-<br />
| poucet<br />
| Christophe Poucet<br />
| Google<br />
| +41796691013<br />
| <br />
| <br />
| <br />
|-<br />
| zeuxis<br />
| Harald Holtmann<br />
| <br />
| +49 176 22053266<br />
| <br />
| <br />
| <br />
|-<br />
| rmies<br />
| Michel Rijnders<br />
| TTY (Amsterdam)<br />
| +31646442127<br />
|<br />
|<br />
|<br />
|-<br />
| <br />
| Simon Meier<br />
| ETH Zurich<br />
| <br />
|<br />
|<br />
|<br />
|-<br />
| Gh_<br />
| Guillaume Hoffmann<br />
|<br />
|<br />
| 19 morning<br />
| 21 afternoon<br />
|<br />
|-<br />
| vvv<br />
| Valery V. Vorotyntsev<br />
| Infopulse Ukraine<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
| jnwhiteh<br />
| Jim Whitehead<br />
| Oxford University Computing Laboratory<br />
| +44 7846 257 133<br />
| <br />
| <br />
|-<br />
| kolmodin<br />
| Lennart Kolmodin<br />
| Västra Götalandsregionen<br />
| +46 73 6223606<br />
| <br />
|<br />
| <br />
|-<br />
| madhadron<br />
| Frederick Ross<br />
| Ecole Polytechnique Federale de Lausanne<br />
| +41 79 710 02 11<br />
| <br />
|<br />
|<br />
|-<br />
| al-maisan<br />
| Muharem Hrnjadovic<br />
| <br />
| +49 (1577) 470-3749<br />
|19 morning<br />
|21 afternoon<br />
|Hotel Neufeld, Friesenbergstraße 15<br />
|<br />
|-<br />
| beschmi<br />
| Benedikt Schmidt<br />
| ETH Zurich<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
| chr1s<br />
| Chris Eidhof<br />
| Tupil / Utrecht University<br />
| +31628887656<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| Martijn van Steenbergen<br />
| Utrecht University<br />
| <br />
|<br />
|<br />
|<br />
|}<br />
<br />
= Additional Comments =<br />
<br />
Please use this section to leave comments for other attendees, e.g. for organizing accommodation.</div>MartijnVanSteenbergenhttps://wiki.haskell.org/HackathonHackathon2009-10-11T15:10:23Z<p>MartijnVanSteenbergen: page was outdated; merged future and past hackathons</p>
<hr />
<div>[[Image:Hac-axe-icon.png|Hac icon]]<br />
<br />
'''Hac: The Haskell Hackathon'''<br />
<br />
The Haskell developer community holds regular hackathons, to get<br />
together, collaborate, and work on key tools and infrastructure.<br />
<br />
* [[Hac7|Edinburgh, Aug 2009]]<br />
* [[Hac φ|Philadelphia, July 2009]]<br />
* [[Hac5|Utrecht, Apr 2009]]<br />
* [[Hac 2008|Göteborg, Apr 2008]]<br />
* [[Hac 2007 II|Freiburg, Oct 2007]]<br />
* [[Hac 2007|Oxford, Jan 2007]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Portland, Sep 2006]<br />
<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-07-03T08:02:07Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. They are distinct from class aliases in that they do not define any new classes (dictionaries), functions or defaults. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
'''Q''': May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
'''Q''': Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
'''Q''': May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
'''Q''': May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
Currently the <code>,</code> separator can be seen as having kind <code>Context -> Context -> Context</code>, but the example above would make this more generic: <code>k -> k -> k</code>.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
'''Q''': What if an instance header expands to several instances of the same class?<br />
<br />
For example, a class alias instance could expand to:<br />
<br />
instance (Functor [], Functor Maybe) where<br />
...<br />
<br />
Then multiple <code>fmap</code>s need to be defined. Which is which?<br />
<br />
'''Q''': What if an instance is made of several classes with overlapping function names?<br />
<br />
Currently function definitions in a class may not be qualified; only the class name in instance header may be qualified. Being able to write several instances under one header introduces naming problems in this case.<br />
<br />
'''Q''': What if a class alias expands to many classes, of which one already has an instance in scope?<br />
<br />
Should we forbid such an instance and force the programmer to expand the class alias manually to all classes except the one of which there is an instance of already?<br />
<br />
Or should such an instance still be allowed, but the implementation of the violating class be forbidden? It seems like a bad idea to allow this without making such an omission clear and explicit in the syntax.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"?<br />
<br />
Clearly there are many differences between the two. Their intended uses are originally different. Should they be two different things instead?<br />
<br />
Class aliases (in the case of writing instances of them) seem like a strict subset of context synonyms. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense.<br />
== Overriding superclass defaults ==<br />
<br />
=== In normal type classes ===<br />
<br />
Consider:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
In current Haskell, the header means two things:<br />
* if you want to write an instance of <code>Applicative</code>, your type should already be an instance of <code>Functor</code>;<br />
* wherever a constraint (dictionary requirement) <code>Applicative</code> appears, a constraint <code>Functor</code> is implied.<br />
<br />
However, such a superclass constraint is often added to mean: if a type is <code>Applicative</code>, then we trivially have an instance of <code>Functor</code> (namely by defining <code>fmap = (<*>) . pure</code>). Sadly, there is no way to automate this in Haskell; programmers still have to define explicit instances for <code>Functor</code>. The following comes close:<br />
<br />
instance Applicative f => Functor f where<br />
fmap = (<*>) . pure<br />
<br />
Except this doesn't work well with the way instances are resolved now: the head of the instance basically says: ''any type'' is a Functor. The superclass constraint isn't checked until after the irrevocable match has been made.<br />
<br />
[[Class system extension proposal]] suggests something like the following to fix this issue:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
fmap = (<*>) . pure<br />
<br />
I.e. allow a class to provide or override default implementations of functions from superclasses. This means that writing an instance of Applicative implies also writing an instance of Functor. What should happen if there already is an instance of Functor in scope?<br />
<br />
=== In context aliases ===<br />
<br />
== Adding new functions ==<br />
<br />
Some documents propose allowing adding new functions to a type class alias.<br />
<br />
'''Q:''' How is this different from a normal type class?<br />
<br />
A critical idea in class aliases is that instances can exist implicitly because there exist instances of all an alias' superclasses. When new functions are introduced in a class alias this can no longer be true. In such cases, what is the added value of type class aliases? They no longer behave differently from normal type classes.</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-07-03T08:01:27Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. They are distinct from class aliases in that they do not define any new classes (dictionaries), functions or defaults. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
'''Q''': May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
'''Q''': Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
'''Q''': May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
'''Q''': May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
Currently the <code>,</code> separator can be seen as having kind <code>Context -> Context -> Context</code>, but the example above would make this more generic: <code>k -> k -> k</code>.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
'''Q''': What if an instance header expands to several instances of the same class?<br />
<br />
For example, a class alias instance could expand to:<br />
<br />
instance (Functor [], Functor Maybe) where<br />
...<br />
<br />
Then multiple <code>fmap</code>s need to be defined. Which is which?<br />
<br />
'''Q''': What if an instance is made of several classes with overlapping function names?<br />
<br />
Currently function definitions in a class may not be qualified; only the class name in instance header may be qualified. Being able to write several instances under one header introduces naming problems in this case.<br />
<br />
'''Q''': What if a class alias expands to many classes, of which one already has an instance in scope?<br />
<br />
Should we forbid such an instance and force the programmer to expand the class alias manually to all classes except the one of which there is an instance of already?<br />
<br />
Or should such an instance still be allowed, but the implementation of the violating class be forbidden? It seems like a bad idea to allow this without making such an omission clear and explicit in the syntax.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"?<br />
<br />
Clearly there are many differences between the two. Their intended uses are originally different. Should they be two different things instead?<br />
<br />
Class aliases (in the case of writing instances of them) seem like a strict subset of context synonyms. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense.<br />
== Overriding superclass defaults ==<br />
<br />
=== In normal type classes ===<br />
<br />
Consider:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
In current Haskell, the header means two things:<br />
* if you want to write an instance of <code>Applicative</code>, your type should already be an instance of <code>Functor</code>;<br />
* wherever a constraint (dictionary requirement) <code>Applicative</code> appears, a constraint <code>Functor</code> is implied.<br />
<br />
However, such a superclass constraint is often added to mean: if a type is <code>Applicative</code>, then we trivially have an instance of <code>Functor</code> (namely by defining <code>fmap = (<*>) . pure</code>). Sadly, there is no way to automate this in Haskell; programmers still have to define explicit instances for <code>Functor</code>. The following comes close:<br />
<br />
instance Applicative f => Functor f where<br />
fmap = (<*>) . pure<br />
<br />
Except this doesn't work well with the way instances are resolved now: the head of the instance basically says: ''any type'' is a Functor. The superclass constraint isn't checked until after the irrevocable match has been made.<br />
<br />
[[Class system extension proposal]] suggests something like the following to fix this issue:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
fmap = (<*>) . pure<br />
<br />
I.e. allow a class to provide or override default implementations of functions from superclasses. This means that writing an instance of Applicative implies also writing an instance of Functor. What should happen if there already is an instance of Functor in scope?<br />
<br />
=== In context aliases ===<br />
<br />
== Adding new functions ==<br />
<br />
Some documents propose allowing adding new functions to a type class alias.<br />
<br />
'''Q:''' How is this different from a normal type class?<br />
<br />
A critical idea in class aliases is that instances can exist implicitly because there exist instances of all an alias' superclasses. When new functions are introduced in a class alias this can no longer be true. In such cases, what is the added value of type class aliases? They are no longer different from how normal type classes behave.</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-07-03T08:01:02Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. They are distinct from class aliases in that they do not define any new classes (dictionaries), functions or defaults. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
'''Q''': May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
'''Q''': Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
'''Q''': May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
'''Q''': May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
Currently the <code>,</code> separator can be seen as having kind <code>Context -> Context -> Context</code>, but the example above would make this more generic: <code>k -> k -> k</code>.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
'''Q''': What if an instance header expands to several instances of the same class?<br />
<br />
For example, a class alias instance could expand to:<br />
<br />
instance (Functor [], Functor Maybe) where<br />
...<br />
<br />
Then multiple <code>fmap</code>s need to be defined. Which is which?<br />
<br />
'''Q''': What if an instance is made of several classes with overlapping function names?<br />
<br />
Currently function definitions in a class may not be qualified; only the class name in instance header may be qualified. Being able to write several instances under one header introduces naming problems in this case.<br />
<br />
'''Q''': What if a class alias expands to many classes, of which one already has an instance in scope?<br />
<br />
Should we forbid such an instance and force the programmer to expand the class alias manually to all classes except the one of which there is an instance of already?<br />
<br />
Or should such an instance still be allowed, but the implementation of the violating class be forbidden? It seems like a bad idea to allow this without making such an omission clear and explicit in the syntax.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"?<br />
<br />
Clearly there are many differences between the two. Their intended uses are originally different. Should they be two different things instead?<br />
<br />
Class aliases (in the case of writing instances of them) seem like a strict subset of context synonyms. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense.<br />
== Overriding superclass defaults ==<br />
<br />
=== In normal type classes ===<br />
<br />
Consider:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
In current Haskell, the header means two things:<br />
* if you want to write an instance of <code>Applicative</code>, your type should already be an instance of <code>Functor</code>;<br />
* wherever a constraint (dictionary requirement) <code>Applicative</code> appears, a constraint <code>Functor</code> is implied.<br />
<br />
However, such a superclass constraint is often added to mean: if a type is <code>Applicative</code>, then we trivially have an instance of <code>Functor</code> (namely by defining <code>fmap = (<*>) . pure</code>). Sadly, there is no way to automate this in Haskell; programmers still have to define explicit instances for <code>Functor</code>. The following comes close:<br />
<br />
instance Applicative f => Functor f where<br />
fmap = (<*>) . pure<br />
<br />
Except this doesn't work well with the way instances are resolved now: the head of the instance basically says: ''any type'' is a Functor. The superclass constraint isn't checked until after the irrevocable match has been made.<br />
<br />
[[Class system extension proposal]] suggests something like the following to fix this issue:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
fmap = (<*>) . pure<br />
<br />
I.e. allow a class to provide or override default implementations of functions from superclasses. This means that writing an instance of Applicative implies also writing an instance of Functor. What should happen if there already is an instance of Functor in scope?<br />
<br />
=== In context aliases ===<br />
<br />
== Adding new functions ==<br />
<br />
Some documents propose allowing adding new functions to a type class alias.<br />
<br />
'''Q:''' How is this different from a normal type class?<br />
<br />
A critical idea in class aliases is that instances sometimes exist implicitly because there exist instances of all an alias' superclasses. When new functions are introduced in a class alias this can no longer be true. In such cases, what is the added value of type class aliases? They are no longer different from how normal type classes behave.</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-27T08:46:18Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. They are distinct from class aliases in that they do not define any new classes (dictionaries), functions or defaults. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
'''Q''': May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
'''Q''': Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
'''Q''': May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
'''Q''': May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
Currently the <code>,</code> separator can be seen as having kind <code>Context -> Context -> Context</code>, but the example above would make this more generic: <code>k -> k -> k</code>.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
'''Q''': What if an instance header expands to several instances of the same class?<br />
<br />
For example, a class alias instance could expand to:<br />
<br />
instance (Functor [], Functor Maybe) where<br />
...<br />
<br />
Then multiple <code>fmap</code>s need to be defined. Which is which?<br />
<br />
'''Q''': What if an instance is made of several classes with overlapping function names?<br />
<br />
Currently function definitions in a class may not be qualified; only the class name in instance header may be qualified. Being able to write several instances under one header introduces naming problems in this case.<br />
<br />
'''Q''': What if a class alias expands to many classes, of which one already has an instance in scope?<br />
<br />
Should we forbid such an instance and force the programmer to expand the class alias manually to all classes except the one of which there is an instance of already?<br />
<br />
Or should such an instance still be allowed, but the implementation of the violating class be forbidden? It seems like a bad idea to allow this without making such an omission clear and explicit in the syntax.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"?<br />
<br />
Clearly there are many differences between the two. Their intended uses are originally different. Should they be two different things instead?<br />
<br />
Class aliases (in the case of writing instances of them) seem like a strict subset of context synonyms. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense.<br />
== Overriding superclass defaults ==<br />
<br />
=== In normal type classes ===<br />
<br />
Consider:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
In current Haskell, the header means two things:<br />
* if you want to write an instance of <code>Applicative</code>, your type should already be an instance of <code>Functor</code>;<br />
* wherever a constraint (dictionary requirement) <code>Applicative</code> appears, a constraint <code>Functor</code> is implied.<br />
<br />
However, such a superclass constraint is often added to mean: if a type is <code>Applicative</code>, then we trivially have an instance of <code>Functor</code> (namely by defining <code>fmap = (<*>) . pure</code>). Sadly, there is no way to automate this in Haskell; programmers still have to define explicit instances for <code>Functor</code>. The following comes close:<br />
<br />
instance Applicative f => Functor f where<br />
fmap = (<*>) . pure<br />
<br />
Except this doesn't work well with the way instances are resolved now: the head of the instance basically says: ''any type'' is a Functor. The superclass constraint isn't checked until after the irrevocable match has been made.<br />
<br />
[[Class system extension proposal]] suggests something like the following to fix this issue:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
fmap = (<*>) . pure<br />
<br />
I.e. allow a class to provide or override default implementations of functions from superclasses. This means that writing an instance of Applicative implies also writing an instance of Functor. What should happen if there already is an instance of Functor in scope?<br />
<br />
=== In context aliases ===<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-26T07:53:00Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. They are distinct from class aliases in that they do not define any new classes (dictionaries), functions or defaults. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
'''Q''': May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
'''Q''': Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
'''Q''': May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
'''Q''': May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
This would overload the <code>,</code> separator to accept not just things of kind * as operands, but things of any kind, as long as the kinds of both operands are equal.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
'''Q''': What if an instance header expands to several instances of the same class?<br />
<br />
For example, a class alias instance could expand to:<br />
<br />
instance (Functor [], Functor Maybe) where<br />
...<br />
<br />
Then multiple <code>fmap</code>s need to be defined. Which is which?<br />
<br />
'''Q''': What if an instance is made of several classes with overlapping function names?<br />
<br />
Currently function definitions in a class may not be qualified; only the class name in instance header may be qualified. Being able to write several instances under one header introduces naming problems in this case.<br />
<br />
'''Q''': What if a class alias expands to many classes, of which one already has an instance in scope?<br />
<br />
Should we forbid such an instance and force the programmer to expand the class alias manually to all classes except the one of which there is an instance of already?<br />
<br />
Or should such an instance still be allowed, but the implementation of the violating class be forbidden? It seems like a bad idea to allow this without making such an omission clear and explicit in the syntax.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"?<br />
<br />
Clearly there are many differences between the two. Their intended uses are originally different. Should they be two different things instead?<br />
<br />
Class aliases (in the case of writing instances of them) seem like a strict subset of context synonyms. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense.<br />
== Overriding superclass defaults ==<br />
<br />
=== In normal type classes ===<br />
<br />
Consider:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
In current Haskell, the header means two things:<br />
* if you want to write an instance of <code>Applicative</code>, your type should already be an instance of <code>Functor</code>;<br />
* wherever a constraint (dictionary requirement) <code>Applicative</code> appears, a constraint <code>Functor</code> is implied.<br />
<br />
However, such a superclass constraint is often added to mean: if a type is <code>Applicative</code>, then we trivially have an instance of <code>Functor</code> (namely by defining <code>fmap = (<*>) . pure</code>). Sadly, there is no way to automate this in Haskell; programmers still have to define explicit instances for <code>Functor</code>. The following comes close:<br />
<br />
instance Applicative f => Functor f where<br />
fmap = (<*>) . pure<br />
<br />
Except this doesn't work well with the way instances are resolved now: the head of the instance basically says: ''any type'' is a Functor. The superclass constraint isn't checked until after the irrevocable match has been made.<br />
<br />
[[Class system extension proposal]] suggests something like the following to fix this issue:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
fmap = (<*>) . pure<br />
<br />
I.e. allow a class to provide or override default implementations of functions from superclasses. This means that writing an instance of Applicative implies also writing an instance of Functor. What should happen if there already is an instance of Functor in scope?<br />
<br />
=== In context aliases ===<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-26T07:31:21Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. Specifically, they do not define any new classes (dictionaries) or functions. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
This would overload the <code>,</code> separator to accept not just things of kind * as operands, but things of any kind, as long as the kinds of both operands are equal.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
It seems that at this point a CS is still interchangable with its RHS at all times.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"? Certainly not without noting that context synonyms may include equality constraints, which make no sense when writing instances of class aliases. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense. Equality constraints are most likely not the only difference.<br />
<br />
== Overriding superclass defaults ==<br />
<br />
=== In normal type classes ===<br />
<br />
Consider:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
In current Haskell, the header means two things:<br />
* if you want to write an instance of <code>Applicative</code>, your type should already be an instance of <code>Functor</code>;<br />
* wherever a constraint (dictionary requirement) <code>Applicative</code> appears, a constraint <code>Functor</code> is implied.<br />
<br />
However, such a superclass constraint is often added to mean: if a type is <code>Applicative</code>, then we trivially have an instance of <code>Functor</code> (namely by defining <code>fmap = (<*>) . pure</code>). Sadly, there is no way to automate this in Haskell; programmers still have to define explicit instances for <code>Functor</code>. The following comes close:<br />
<br />
instance Applicative f => Functor f where<br />
fmap = (<*>) . pure<br />
<br />
Except this doesn't work well with the way instances are resolved now: the head of the instance basically says: ''any type'' is a Functor. The superclass constraint isn't checked until after the irrevocable match has been made.<br />
<br />
[[Class system extension proposal]] suggests something like the following to fix this issue:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
fmap = (<*>) . pure<br />
<br />
I.e. allow a class to provide or override default implementations of functions from superclasses. This means that writing an instance of Applicative implies also writing an instance of Functor. What should happen if there already is an instance of Functor in scope?<br />
<br />
=== In context aliases ===<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-25T23:09:50Z<p>MartijnVanSteenbergen: started writing Overriding superclass defaults</p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. Specifically, they do not define any new classes (dictionaries) or functions. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
This would overload the <code>,</code> separator to accept not just things of kind * as operands, but things of any kind, as long as the kinds of both operands are equal.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"? Certainly not without noting that context synonyms may include equality constraints, which make no sense when writing instances of class aliases. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense. Equality constraints are most likely not the only difference.<br />
<br />
== Overriding superclass defaults ==<br />
<br />
Consider:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
In current Haskell, the header means two things:<br />
* if you want to write an instance of <code>Applicative</code>, your type should already be an instance of <code>Functor</code>;<br />
* wherever a constraint (dictionary requirement) <code>Applicative</code> appears, a constraint <code>Functor</code> is implied.<br />
<br />
However, such a superclass constraint is often added to mean: if a type is <code>Applicative</code>, then we trivially have an instance of <code>Functor</code> (namely by defining <code>fmap = (<*>) . pure</code>). Sadly, there is no way to automate this in Haskell; programmers still have to define explicit instances for <code>Functor</code>. The following comes close:<br />
<br />
instance Applicative f => Functor f where<br />
fmap = (<*>) . pure<br />
<br />
Except this doesn't work well with the way instances are resolved now: the head of the instance basically says: ''any type'' is a Functor. The superclass constraint isn't checked until after the irrevocable match has been made.<br />
<br />
[[Class system extension proposal]] suggests something like the following to fix this issue:<br />
<br />
class Functor f => Applicative f where<br />
pure :: a -> f a<br />
(<*>) :: f (a -> b) -> f a -> f b<br />
<br />
fmap = (<*>) . pure<br />
<br />
I.e. allow a class to provide or override default implementations of functions from superclasses. This means that writing an instance of Applicative implies also writing an instance of Functor. What should happen if there already is an instance of Functor in scope?<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-25T22:48:06Z<p>MartijnVanSteenbergen: added section "Instances of class aliases"</p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. Specifically, they do not define any new classes (dictionaries) or functions. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
This would overload the <code>,</code> separator to accept not just things of kind * as operands, but things of any kind, as long as the kinds of both operands are equal.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
One of John Meacham's main reasons for his proposal is the lack of possibilities for abstraction in the current class system: "there is no way to hide the fact that you changed a class hierarchy", he writes. Therefore, he introduces the possibility of writing instances of ''class aliases'':<br />
<br />
class alias Num a = (Additive a, AdditiveNegation a, Multiplicative a, FromInteger a)<br />
<br />
instance Num a where<br />
zero = ...<br />
(+) = ...<br />
(-) = ...<br />
negate = ...<br />
one = ...<br />
(*) = ...<br />
fromInteger = ...<br />
<br />
'''Motivation''': Class designers can now later split up a class in smaller classes if they redefine the initial class as a class alias for the new, smaller type classes. More specifically, this could solve the Num hierarchy problem: how to redefine the Num-related type classes in the prelude while maintaining backwards compatibility?<br />
<br />
John's example above introduces new functions <code>zero</code> and <code>one</code> which conflicts with the idea of splitting up Num in strict subclasses. However, this problem is (supposedly?) solved by overriding superclass defaults; see below. Also, <code>signum</code> and <code>abs</code> are not present in the example, but they may be added to the appropriate subclasses.<br />
<br />
John's proposal can be decomposed into two smaller steps:<br />
* being able to write one instance header for several instances at the same time<br />
* then replacing the several type classes by a class alias.<br />
<br />
=== Class alias or context synonym? ===<br />
<br />
Can class aliases as used above be read as "context synonyms"? Certainly not without noting that context synonyms may include equality constraints, which make no sense when writing instances of class aliases. If class aliases are to piggyback on context synonyms, then we need to think carefully about what form such a context synonym should have for instances to make sense. Equality constraints are most likely not the only difference.<br />
<br />
== Overriding superclass defaults ==<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-25T22:12:09Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. We also point out potential pitfalls or things that need more pondering: many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
Furthermore, most motivations can be grouped into two categories:<br />
* increasing the flexibility of the class system, useful when designing new API;<br />
* changing an existing API while maintaining backwards compatibility.<br />
<br />
== List of proposals ==<br />
<br />
We've found the following documents that propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. Specifically, they do not define any new classes (dictionaries) or functions. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
This would overload the <code>,</code> separator to accept not just things of kind * as operands, but things of any kind, as long as the kinds of both operands are equal.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
== Overriding superclass defaults ==<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-25T21:53:43Z<p>MartijnVanSteenbergen: </p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. Many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
We also point out potential pitfalls or things that need more pondering.<br />
<br />
== List of proposals ==<br />
<br />
We've found that the following documents propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. Specifically, they do not define any new classes (dictionaries) or functions. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
This would overload the <code>,</code> separator to accept not just things of kind * as operands, but things of any kind, as long as the kinds of both operands are equal.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
== Overriding superclass defaults ==<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Comparing_class_alias_proposalsComparing class alias proposals2009-04-25T21:51:13Z<p>MartijnVanSteenbergen: initial draft</p>
<hr />
<div>[http://repetae.net/recent/out/classalias.html John Meacham's proposal] for type class aliases has been around for a few years now. It has not been implemented yet; instead, several variations to his original proposal have come up. In this document we collect those ideas and their motivations in a hopefully clear overview. Many ideas look very attractive and promising but prove troublesome when made formal. We believe this is the main reason they haven't been implemented yet.<br />
<br />
For each idea we give a motivation from the point of view of a stakeholder. We identify three stakeholders:<br />
* the designer of a class or class hierarchy;<br />
* the author of class instances;<br />
* the programmer using the classes and instances.<br />
<br />
We also point out potential pitfalls or things that need more pondering.<br />
<br />
== List of proposals ==<br />
<br />
We've found that the following documents propose extensions or variations of the original proposal:<br />
<br />
* [http://repetae.net/recent/out/classalias.html John Meacham's original proposal]<br />
* [[Context alias]]<br />
* [[Superclass defaults]]<br />
* [[Class system extension proposal]]<br />
* GHC ticket 788: [http://hackage.haskell.org/trac/ghc/ticket/788 Class aliases]<br />
<br />
== Context synonyms ==<br />
<br />
The most basic idea is that of a context synonym (CS):<br />
<br />
context BoundedEnum a = (Bounded a, Enum a)<br />
context SatisfyA f s = (Satisfy f, Alternative f, Input f ~ s)<br />
<br />
A context synonym may appear anywhere a context is allowed:<br />
* in the type signature of a function;<br />
* in a data type or constructor;<br />
* in a superclass constraint.<br />
<br />
The arguments to a CS have to be kind-checked. In the examples above:<br />
Bounded, Enum, BoundedEnum :: * -> Context<br />
Satisfy, Alternative :: (* -> *) -> Context<br />
Input :: (* -> *) -> *<br />
SatisfyA :: (* -> *) -> * -> Context<br />
<br />
Context synonyms are synonymous and interchangable with their right-hand sides, much like type synonyms. Ideally, they can be exported and documented, just like type synonyms.<br />
<br />
'''Motivation''': CS's are useful when a particularly long context keeps popping up, something that often happens when type-level programming is applied, for example with generic programming. They are interesting for programmers using already existing classes.<br />
<br />
<br />
== Higher-order context synonyms ==<br />
<br />
Possible additions to the context synonyms include:<br />
<br />
May a CS's RHS refer to other CS's? For example:<br />
<br />
context Foo a = (BoundedEnum a, Eq a, Ord a)<br />
<br />
This introduces the possibility of loops. Should loops be forbidden? It could be argued that in some cases of loops, the CS's transitive closure should be used, but this is only acceptable if the closure is finite. It seems more elegant to just forbid all loops.<br />
<br />
Apart from type constructors, may a CS's variables be class constructors (things of kind ... -> Context) as well? For example:<br />
<br />
context Bar a = a Int<br />
<br />
Here Bar :: (* -> Context) -> Context<br />
<br />
May CS's be passed as arguments to other CS's? For example:<br />
<br />
context Biz = Bar BoundedEnum<br />
<br />
May CS's be partially applied? Consider these alternate definitions of BoundedEnum:<br />
<br />
context BoundedEnum a = (Bounded, Enum) a<br />
context BoundedEnum = (Bounded, Enum)<br />
<br />
This would overload the <code>,</code> separator to accept not just things of kind * as operands, but things of any kind, as long as the kinds of both operands are equal.<br />
<br />
'''Motivation''': these ideas are direct extensions of context synonyms and are useful for clients.<br />
<br />
<br />
== Instances of class aliases ==<br />
<br />
== Overriding superclass defaults ==<br />
<br />
== Adding new functions ==</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5/Attendees/PhotoHac5/Attendees/Photo2009-04-21T19:11:13Z<p>MartijnVanSteenbergen: intro; credits</p>
<hr />
<div>== Hac5: Group photo ==<br />
<br />
A photograph of almost all attendants, taken by Thomas Davie. See also the [[Photo Full Size|full size photo]]. Below is a list of everyone on the photo.<br />
<br />
[[Image:Hac5.jpg]]<br />
<br />
[[Image:Hac5Legend.jpg]]<br />
<br />
{| class="wikitable"<br />
! Number<br />
! Name (nick)<br />
|-<br />
| 1<br />
| Lennart Kolmodin (kolmodin)<br />
|-<br />
| 2<br />
| Benedikt Schmidt (beschmi)<br />
|-<br />
| 3<br />
| -<br />
|-<br />
| 4<br />
| Erik Hesselink<br />
|-<br />
| 5<br />
| Thomas van Noort<br />
|-<br />
| 6<br />
| -<br />
|-<br />
| 7<br />
| Martijn Schrage<br />
|-<br />
| 8<br />
| Sebastiaan Visser<br />
|-<br />
| 9<br />
| -<br />
|-<br />
| 10<br />
| -<br />
|-<br />
| 11<br />
| David Himmelstrup (Lemmih)<br />
|-<br />
| 12<br />
| Alexey Rodriguez<br />
|-<br />
| 13<br />
| Tom Lokhorst<br />
|-<br />
| 14<br />
| Clara Löh (smurfpje)<br />
|-<br />
| 15<br />
| Bas van Dijk<br />
| -<br />
|-<br />
| 16<br />
| Ganesh Sittampalam (Heffalump)<br />
|-<br />
| 17<br />
| Eelco Dolstra<br />
|-<br />
| 18<br />
| Nicolas Pouillard (npouillard, ertai)<br />
|-<br />
| 19<br />
| Arie Middelkoop<br />
|-<br />
| 20<br />
| Atze Dijkstra<br />
|-<br />
| 21<br />
| Reinier Lamers (tux_rocker)<br />
|-<br />
| 22<br />
| Roman Cheplyaka (Feuerbach)<br />
|-<br />
| 23<br />
| Simon Hengel<br />
|-<br />
| 24<br />
| Chris Eidhof<br />
|-<br />
| 25<br />
| -<br />
|-<br />
| 26<br />
| Jeroen Fokker<br />
|-<br />
| 27<br />
| Thomas Davie (beelsebob)<br />
|-<br />
| 28<br />
| Peter Verswyvelen (Chatterbox)<br />
|-<br />
| 29<br />
| Eric Kow (kowey)<br />
|-<br />
| 30<br />
| Don Stewart (dons)<br />
|-<br />
| 31<br />
| -<br />
|-<br />
| 32<br />
| Martijn van Steenbergen<br />
|-<br />
| 33<br />
| Ben Moseley<br />
|-<br />
| 34<br />
| -<br />
|-<br />
| 35<br />
| Christophe Poucet (vincenz/poucet)<br />
|-<br />
| 36<br />
| Wolfgang Jeltsch (jeltsch)<br />
|-<br />
| 37<br />
| Markus Klinik<br />
|-<br />
| 38<br />
| Ian Lynagh (Igloo)<br />
|-<br />
| 39<br />
| Remi Turk<br />
|-<br />
| 40<br />
| José Pedro Magalhães (dreixel)<br />
|-<br />
| 41<br />
| Duncan Coutts<br />
|-<br />
| 42<br />
| Thomas Schilling<br />
|-<br />
| 43<br />
| Doaitse Swierstra<br />
|-<br />
| 44<br />
| Vincent Zweije<br />
|-<br />
| 45<br />
| Eelco Lempsink<br />
|-<br />
| 46<br />
| Thorkil Naur (thorkilnaur)<br />
|-<br />
| 47<br />
| Andres Löh (kosmikus)<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T19:08:06Z<p>MartijnVanSteenbergen: added group photo credits</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
[[Image:Hac5.jpg|right|480px|thumb|Group photo of [[/Attendees/Photo|almost all attendees]], taken by Thomas Davie.]]<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon was held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. The event was organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
The [[Dutch HUG]] was founded on the last day of the event.<br />
<br />
* [[/Attendees|All participants]], including a [[/Attendees/Photo|group photo]]!<br />
* [[/Projects|Projects]] that were worked on<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC: visit #haskell-hac5 in Freenode.<br />
* Very nice [http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100786831801514107226.0004627927d6898c55d28&ll=52.098386,5.13525&spn=0.016082,0.037594&t=h&z=15 GMap] with all locations of interest<br />
* [[/Old_information|Old information]] with practical information: location, travelling, accomodation, etc.<br />
<br />
== Blogosphere coverage ==<br />
<br />
* [http://search.twitter.com/search?q=%23hac5 Live Twitter feed]<br />
* Tupil on their [http://blog.tupil.com/running-happstack-applications-with-fastcgi/ happstack-fastcgi bridge]<br />
* Christophe Poucet on [http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/ adaptive containers]<br />
* Lots of pictures by Martijn van Steenbergen ([http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Friday], [http://martijn.van.steenbergen.nl/journal/2009/04/19/hac5-saturday/ Saturday], [http://martijn.van.steenbergen.nl/journal/2009/04/21/hac5—sunday/ Sunday])<br />
* Video clips by Tom Lokhorst:<br />
** [http://www.youtube.com/watch?v=_2_OlPbs7dw Announcement of the UHC]<br />
** [http://vimeo.com/4258084 Vacuum + adaptive containers demo]<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
See also the general [[Hackathon|Hackathon page]].<br />
<br />
== Organization ==<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T18:54:43Z<p>MartijnVanSteenbergen: added link to Sunday's pics</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
[[Image:Hac5.jpg|right|480px|thumb|Group photo of [[/Attendees/Photo|almost all attendees]].]]<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon was held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. The event was organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
The [[Dutch HUG]] was founded on the last day of the event.<br />
<br />
* [[/Attendees|All participants]], including a [[/Attendees/Photo|group photo]]!<br />
* [[/Projects|Projects]] that were worked on<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC: visit #haskell-hac5 in Freenode.<br />
* Very nice [http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100786831801514107226.0004627927d6898c55d28&ll=52.098386,5.13525&spn=0.016082,0.037594&t=h&z=15 GMap] with all locations of interest<br />
* [[/Old_information|Old information]] with practical information: location, travelling, accomodation, etc.<br />
<br />
== Blogosphere coverage ==<br />
<br />
* [http://search.twitter.com/search?q=%23hac5 Live Twitter feed]<br />
* Tupil on their [http://blog.tupil.com/running-happstack-applications-with-fastcgi/ happstack-fastcgi bridge]<br />
* Christophe Poucet on [http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/ adaptive containers]<br />
* Lots of pictures by Martijn van Steenbergen ([http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Friday], [http://martijn.van.steenbergen.nl/journal/2009/04/19/hac5-saturday/ Saturday], [http://martijn.van.steenbergen.nl/journal/2009/04/21/hac5—sunday/ Sunday])<br />
* Video clips by Tom Lokhorst:<br />
** [http://www.youtube.com/watch?v=_2_OlPbs7dw Announcement of the UHC]<br />
** [http://vimeo.com/4258084 Vacuum + adaptive containers demo]<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
See also the general [[Hackathon|Hackathon page]].<br />
<br />
== Organization ==<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T11:17:11Z<p>MartijnVanSteenbergen: fixed saturday's link</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
[[Image:Hac5.jpg|right|480px|thumb|Group photo of [[/AttendeePhoto|almost all attendees]].]]<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon was held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. The event was organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
The [[Dutch HUG]] was founded on the last day of the event.<br />
<br />
* [[/Attendees|All participants]], including a [[/AttendeePhoto|group photo]]!<br />
* [[/Projects|Projects]] that were worked on<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC: visit #haskell-hac5 in Freenode.<br />
* Very nice [http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100786831801514107226.0004627927d6898c55d28&ll=52.098386,5.13525&spn=0.016082,0.037594&t=h&z=15 GMap] with all locations of interest<br />
* [[/OldInfo|Old information]] with practical information: location, travelling, accomodation, etc.<br />
<br />
== Blogosphere coverage ==<br />
<br />
* [http://search.twitter.com/search?q=%23hac5 Live Twitter feed]<br />
* [http://www.youtube.com/watch?v=_2_OlPbs7dw Announcement of the UHC] by Tom Lokhorst<br />
* Tupil on their [http://blog.tupil.com/running-happstack-applications-with-fastcgi/ happstack-fastcgi bridge]<br />
* Christophe Poucet on [http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/ adaptive containers]<br />
* Lots of pictures by Martijn van Steenbergen ([http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Friday], [http://martijn.van.steenbergen.nl/journal/2009/04/19/hac5-saturday/ Saturday], Sunday)<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
See also the general [[Hackathon|Hackathon page]].<br />
<br />
== Organization ==<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T11:16:06Z<p>MartijnVanSteenbergen: almost</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
[[Image:Hac5.jpg|right|480px|thumb|Group photo of [[/AttendeePhoto|almost all attendees]].]]<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon was held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. The event was organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
The [[Dutch HUG]] was founded on the last day of the event.<br />
<br />
* [[/Attendees|All participants]], including a [[/AttendeePhoto|group photo]]!<br />
* [[/Projects|Projects]] that were worked on<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC: visit #haskell-hac5 in Freenode.<br />
* Very nice [http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100786831801514107226.0004627927d6898c55d28&ll=52.098386,5.13525&spn=0.016082,0.037594&t=h&z=15 GMap] with all locations of interest<br />
* [[/OldInfo|Old information]] with practical information: location, travelling, accomodation, etc.<br />
<br />
== Blogosphere coverage ==<br />
<br />
* [http://search.twitter.com/search?q=%23hac5 Live Twitter feed]<br />
* [http://www.youtube.com/watch?v=_2_OlPbs7dw Announcement of the UHC] by Tom Lokhorst<br />
* Tupil on their [http://blog.tupil.com/running-happstack-applications-with-fastcgi/ happstack-fastcgi bridge]<br />
* Christophe Poucet on [http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/ adaptive containers]<br />
* Lots of pictures by Martijn van Steenbergen ([http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Friday], [http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Saturday], Sunday)<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
See also the general [[Hackathon|Hackathon page]].<br />
<br />
== Organization ==<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T09:45:40Z<p>MartijnVanSteenbergen: added group photo, link to old info and link to Dutch HUG</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
[[Image:Hac5.jpg|right|480px|thumb|Group photo of [[/AttendeePhoto|all attendees]].]]<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon was held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. The event was organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
The [[Dutch HUG]] was founded on the last day of the event.<br />
<br />
* [[/Attendees|All participants]], including a [[/AttendeePhoto|group photo]]!<br />
* [[/Projects|Projects]] that were worked on<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC: visit #haskell-hac5 in Freenode.<br />
* Very nice [http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100786831801514107226.0004627927d6898c55d28&ll=52.098386,5.13525&spn=0.016082,0.037594&t=h&z=15 GMap] with all locations of interest<br />
* [[/OldInfo|Old information]] with practical information: location, travelling, accomodation, etc.<br />
<br />
== Blogosphere coverage ==<br />
<br />
* [http://search.twitter.com/search?q=%23hac5 Live Twitter feed]<br />
* [http://www.youtube.com/watch?v=_2_OlPbs7dw Announcement of the UHC] by Tom Lokhorst<br />
* Tupil on their [http://blog.tupil.com/running-happstack-applications-with-fastcgi/ happstack-fastcgi bridge]<br />
* Christophe Poucet on [http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/ adaptive containers]<br />
* Lots of pictures by Martijn van Steenbergen ([http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Friday], [http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Saturday], Sunday)<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
See also the general [[Hackathon|Hackathon page]].<br />
<br />
== Organization ==<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T09:35:09Z<p>MartijnVanSteenbergen: added link to gmap</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon was held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. The event was organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
* [[/Attendees|All participants]], including a [[/AttendeePhoto|group photo]]!<br />
* [[/Projects|Projects]] that were worked on<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC: visit #haskell-hac5 in Freenode.<br />
* Very nice [http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100786831801514107226.0004627927d6898c55d28&ll=52.098386,5.13525&spn=0.016082,0.037594&t=h&z=15 GMap] with all locations of interest<br />
<br />
== Blogosphere coverage ==<br />
<br />
* [http://search.twitter.com/search?q=%23hac5 Live Twitter feed]<br />
* [http://www.youtube.com/watch?v=_2_OlPbs7dw Announcement of the UHC] by Tom Lokhorst<br />
* Tupil on their [http://blog.tupil.com/running-happstack-applications-with-fastcgi/ happstack-fastcgi bridge]<br />
* Christophe Poucet on [http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/ adaptive containers]<br />
* Lots of pictures by Martijn van Steenbergen ([http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Friday], [http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Saturday], Sunday)<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
See also the general [[Hackathon|Hackathon page]].<br />
<br />
== Organization ==<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T09:33:37Z<p>MartijnVanSteenbergen: rephrased stuff, added blog coverage links</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon was held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. The event was organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
* [[/Attendees|All participants]], including a [[/AttendeePhoto|group photo]]!<br />
* [[/Projects|Projects]] that were worked on<br />
* Mailing list: [http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org]<br />
* IRC: visit #haskell-hac5 in Freenode.<br />
<br />
== Blogosphere coverage ==<br />
<br />
* [http://search.twitter.com/search?q=%23hac5 Live Twitter feed]<br />
* [http://www.youtube.com/watch?v=_2_OlPbs7dw Announcement of the UHC] by Tom Lokhorst<br />
* Tupil on their [http://blog.tupil.com/running-happstack-applications-with-fastcgi/ happstack-fastcgi bridge]<br />
* Christophe Poucet on [http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/ adaptive containers]<br />
* Lots of pictures by Martijn van Steenbergen ([http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Friday], [http://martijn.van.steenbergen.nl/journal/2009/04/17/hac5-friday/ Saturday], Sunday)<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
See also the general [[Hackathon|Hackathon page]].<br />
<br />
== Organization ==<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5Hac52009-04-21T09:11:47Z<p>MartijnVanSteenbergen: moved info to Hac5/OldInfo</p>
<hr />
<div>[[Image:Hackathon-utrecht.png|Hac 05 Logo]]<br />
<br />
'''Hac5: The 5th Haskell Hackathon'''<br />
<br />
April 17-19, 2009<br />
Utrecht, The Netherlands<br />
<br />
Sponsored by: <br />
<br />
[[Image:galois.jpg]] [[Image:Research_bL.png]] [[Image:Tupil-logo-wb.png]]<br />
<br />
'''[http://galois.com/ Galois]''', '''[http://research.microsoft.com/ Microsoft Research]''' and '''[http://tupil.com Tupil]'''.<br />
Microsoft is a registered trademark of Microsoft Corporation.<br />
<br />
== About ==<br />
<br />
The Haskell Hackathon is an international, grassroots collaborative coding festival with a simple focus: build and improve Haskell libraries, tools, and infrastructure. Of course, we have fun doing it, too!<br />
<br />
The 5th Haskell Hackathon will be held from April 17 to 19, 2009, in the [http://en.wikipedia.org/wiki/Utrecht_(city) city of Utrecht] in the [http://en.wikipedia.org/wiki/Netherlands Netherlands]. This year's event is being organized by members of the [http://www.cs.uu.nl/ Department of Information and Computing Sciences] at [http://www.uu.nl/ Utrecht University] and by associates of [http://tupil.com/ Tupil].<br />
<br />
== Projects ==<br />
<br />
Check out the possible [[/Projects|projects]] that you might work on or add your own.<br />
<br />
== Attendees ==<br />
<br />
See [[/Attendees|who else is attending]]. If you've already registered, please add yourself to the list.<br />
<br />
== Previous Haskell Hackathons ==<br />
<br />
* [[Hackathon|Hackathon page]]<br />
<br />
* [[Hac4|Hac 4 (2008)- Gothenburg]]<br />
* [[Hac_2007_II|Hac 2007 II - Freiburg]]<br />
* [[Hac_2007|Hac 2007 - Oxford]]<br />
* [http://hackage.haskell.org/trac/ghc/wiki/Hackathon Hac 2006 - Portland]<br />
<br />
== Organization ==<br />
<br />
=== Mailing list ===<br />
<br />
[http://www.haskell.org/mailman/listinfo/hackathon hackathon@haskell.org] <br />
<br />
=== IRC channel ===<br />
<br />
Visit <br />
<br />
#haskell-hac5<br />
<br />
in Freenode.<br />
<br />
=== Organisers ===<br />
<br />
The organisers for Hac5 are:<br />
<br />
* Andres Löh<br />
* José Pedro Magalhães<br />
* Sean Leather<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
* more<br />
<br />
[[Category:Community]]<br />
[[Category:Events]]<br />
[[Category:Hackathon]]<br />
<br />
== Photo ==<br />
<br />
Here is a [[/AttendeePhoto|group photo]] with people's names.</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5/Old_informationHac5/Old information2009-04-21T09:11:42Z<p>MartijnVanSteenbergen: from old Hac5 page</p>
<hr />
<div>== News ==<br />
<br />
* 2009-04-07: Both Galois and Microsoft Research are willing to sponsor the event. We will try to use the money to cover some of the food.<br />
* 2009-02-11: The date has been picked.<br />
<br />
== Registration ==<br />
<br />
If you will be attending, please [[/Register|register]].<br />
The number of attendees may be limited, depending on availability of space or other resources.<br />
<br />
== When ==<br />
<br />
* April 17-19 2009<br />
<br />
In general, the rooms will be open for hacking each day at 10:00 am. Each<br />
night, we should try to leave around 10:00 pm. Alas, we are not allowed to stay<br />
in the room all night<br />
<br />
If sufficiently many participants are already around on April 16<br />
or are still around on April 20, a small symposium and/or an excursion<br />
could be organized.<br />
<br />
== Location ==<br />
<br />
[[Image:BBL.jpg|thumb|The building's facade]]<br />
<br />
[[Image:Minnaert.jpg|thumb|This is the Minnaert building, which is easier to spot. The BBL is right behind it, where the arrow points to.]]<br />
<br />
[http://www.cs.uu.nl/docs/reach/bbl.php Buys Ballot Laboratorium (BBL)] at [http://www.uu.nl/EN/whowhatwhere/Pages/default.aspx Utrecht University]. Room numbers: 426 on Friday, 415 on Saturday and Sunday.<br />
<br />
=== Getting to Utrecht ===<br />
<br />
==== Air ====<br />
<br />
* Schiphol<br />
*:[http://www.schiphol.nl/Homepage/Homepage.htm Schiphol Airport] (AMS) is the main airport of the Netherlands. There is a train station right underneath the airport, and every 15min there is a direct train to Utrecht.<br />
<br />
* Eindhoven<br />
*:The [http://www.eindhovenairport.com/ airport in Eindhoven] (EIN) is cheaper than Schiphol, so many low-cost airlines fly there. There is a bus terminal outside the airport which will take you to Eindhoven station.<br />
<br />
==== Train ====<br />
<br />
* International trains (UK, France, Belgium, Germany)<br />
<br />
* National trains<br />
** General information<br />
**:[http://ns.nl/cs/Satellite/travellers NS] is the main public transport railway company in the Netherlands. You can buy tickets on machines at the station (you can also [http://webdemo.ns.nl/webdemo.e2000/ practice this online]). Maestro Debit cards are usually accepted and credit cards should work too, but in practice I've seen many people having trouble with this.<br />
**:If you pay with cash you have to go the counter, where you'll be charged extra for the ticket.<br />
**: <br /><br />
** From Schiphol, trains depart to Utrecht every 15min. The ticket price is €7,80 (second class, full-fare, one-way). The trip takes about 30min.<br />
**: <br /><br />
** From Eindhoven Airport, first you have to take bus 401 to Eindhoven station. There is a ticket machine inside the bus but you will need (Euro) coins to pay. Then from Eindhoven station you can take the train to Utrecht. There are trains every 15min to Utrecht Centraal. The ticket price is €12,80 (second class, full-fare, one-way). The trip takes about 50min.<br />
**: <br /><br />
* Arriving at Utrecht Central<br />
*:Outside the train station in Utrecht is the main bus station. From there you can take buses number 11, 12 or 12S to the University. The trip takes about 20min and takes 3 [http://en.wikipedia.org/wiki/Strippenkaart 'strippen'].<br />
<br />
==== Sea ====<br />
<br />
* Pier "Hoek van Hollland"<br />
*:From Hoek van Holland you can take the train to Rotterdam (Centraal), and from there to Utrecht. The train station is located just next to the pier. The trip takes about 1h20 and costs €13.30 (second class, full-fare, one-way). You don't need to buy any ticket in Rotterdam, you can just buy a ticket from Hoek van Holland to Utrecht.<br />
<br />
=== Transportation in Utrecht ===<br />
<br />
* Public transportation<br />
** To travel by bus, tramway or metro in the Netherlands, you're advised to buy your ticket in advance. This ticket is called a 'strippenkaart'. Strippenkaarten of 15 or 45 strips are available for €7.30 and €21.60 respectively, and one trip on the bus within a city (including all transfers within 60 minutes) is usually 2 or 3 strips of the card. Most places within the city center of Utrecht are one zone away from the zone where Utrecht University is located, hence you use 3 strippen for this trip.<br />
** Typically you enter the bus through the front door and tell the driver where you want to go. He then stamps the appropriate number of stripes from your strippenkaart. However, in some cases the bus driver might open all the doors and assume people will stamp the tickets themselves (this will typically happen for buses 11 and 12 during rush hour). You can then use the yellow (or nowadays grey) stamp machines inside the bus or at the station just before you depart.<br />
** Buying tickets on the bus is far more expensive. You can get these multiple-strip-/zone-tickets-card(s) in many places, including bus stations, post offices, cigar/magazine shops and some supermarkets (at the service desk or from a vending machine). You can use it also for multiple-party travel for yourself and other persons at the same time. You can read more about the strippenkaart in the [http://www.vbn-bv.nl/ovinfo/algemeen_en.asp?vPaginaID=140 ov-info website].<br />
<br />
* By bike<br />
** Biking is a very convenient way of traveling inside a city in the Netherlands. In particular, the way from Utrecht central station to the University is mostly through separate bike lanes and takes about 20 minutes. You can rent a bike from one of 3 bike parking areas at the station. The daily fee is €6.50 and you have to pay a deposit of €60 and show proof of identity (either driver's license or passport). (Note that these are not "OV-fiets"---those require a yearly subscription.) These places are open from 5am to 2am, every day of the week.<br />
** Make sure to obey traffic lights for bikes as being fined for not doing so is very common. You should also have your front and rear lights on when biking during nighttime (a rented bike will most probably have these in working condition). Also be careful where you park your bike and always lock it securely, since bike theft is very common in the Netherlands.<br />
<br />
=== Getting to the BBL ===<br />
<br />
There are two main bus lines that connect Utrecht city center to the University campus at the Uithof (pronounced something like OUT-hof): 11 and 12. Both depart from Utrecht Central Station, but then follow different routes to the campus.<br />
<br />
To know which line is more suitable to you, you can use [http://journeyplanner.9292.nl/ 9292ov]. Insert as departing point the address of your hotel and as destination Princetonplein 5, Utrecht. You will then be told the bus stop and bus number that you can take. Depending on where you are staying, it could also be that the best bus is not 11 nor 12: in that case simply follow the advice of the website.<br />
<br />
If you are coming with bus number 11, you should leave at bus stop "Botanische Tuinen" (Botanical Gardens). If you are coming with bus number 12, you should leave at bus stop "Padualaan". From either bus stop you will easily spot the [http://www.haskell.org/haskellwiki/Image:Minnaert.jpg Minnaert building]. If you walk towards it, you will notice there are small circular metal plates on the floor forming a path into the building. On Friday you can simply follow this path: it will take you into the building and across the internal bridge to the BBL, leaving you at the stairs where you can walk up. Alternatively you can walk along the corridor and you will find the elevators. During the weekend the Minnaert building will be closed, so you cannot follow this path. But by then it should be relatively easy for you to figure out how to walk around it on the outside and access the [http://www.haskell.org/haskellwiki/Image:BBL.jpg BBL from its front entrance].<br />
<br />
If you find yourself outside the building and cannot get in (which is likely to happen during the weekend or Friday evening), just call one of the two contact phone numbers under [[Hac5#Contact]]. Someone will come to open the door for you. You can also use these numbers in case you get lost or have any other problem.<br />
If you leave at the wrong bus stop, do not worry. In case you left before the correct bus stop, you can either walk along the bus route (if you were just one stop earlier) or wait for another bus to come (typically they are frequent). Your ticket will still be valid because it’s valid for one hour from the time it’s stamped.<br />
<br />
In case you left after the correct bus stop, you will probably still be inside the University campus, since both the 11 and the 12 bus lines end at the University Hospital. You’ll just have to walk a bit back and find your way to the BBL.<br />
<br />
There's also a [http://plattegrond.uu.nl/print/uithofprintversie2008.pdf pdf map of the campus].<br />
<br />
=== Accommodation ===<br />
<br />
It's not always easy to find loads of choice in accommodation in Utrecht. In particular, the Hackathon weekend coincides with a [http://www.recordplanet.nl/index.php?page=platenbeurs-2009 record fair]. So you should try to make your room reservation as soon as possible. You can have a look at [http://www.hotels.nl/utrecht/ hotels.nl].<br />
<br />
Another possibility is to stay in Amsterdam. The train to Utrecht takes 30 minutes and runs all night. Here are two search engines for [http://www.hotels.nl/ hotels] and [http://www.hostelsamsterdam.com/ hostels] in Amsterdam.<br />
<br />
If you have any doubts about any place, for instance about how easy it is to reach the University from there, just ask the organizers.<br />
<br />
== Map ==<br />
<br />
There is also an [http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100786831801514107226.0004627927d6898c55d28&ll=52.098386,5.13525&spn=0.016082,0.037594&t=h&z=15 annotated Google Map with important locations].<br />
<br />
== Preparations ==<br />
<br />
=== What to bring ===<br />
<br />
* A laptop<br />
* Wireless card if necessary. There will be wireless network access. Ethernet access will probably not be available. If you really need ethernet access, please contact the organizers.<br />
* Power adapters if necessary. Power sockets in the Netherlands are [http://www.adaptelec.com/index.php?main_page=document_general_info&products_id=172 220-240V CEE 7/4] (a.k.a. [http://en.wikipedia.org/wiki/Schuko "Schuko"]).<br />
* Mobile phone<br />
<br />
=== Before you arrive ===<br />
<br />
* Pick out a couple of projects to work on and familiarise yourself with them<br />
* Install an up to date Haskell toolchain (preferrably ghc-6.10.1).<br />
<br />
== Contact ==<br />
<br />
For any questions or emergencies, you can always call Pedro (+31 650459029) or Chris (+31 628887656).</div>MartijnVanSteenbergenhttps://wiki.haskell.org/User_groupsUser groups2009-04-20T08:26:39Z<p>MartijnVanSteenbergen: whoops... moved Dutch HUG to the right section</p>
<hr />
<div>[[Category:Community]]<br />
<br />
A range of Haskell User Groups are springing up all over. Also see a [http://www.frappr.com/haskellers Map of Haskellers].<br />
<br />
== User groups ==<br />
<br />
Regular meetings in a particular geographical area. Great if you want to see and meet other Haskellers.<br />
<br />
===North America===<br />
<br />
====West Coast ====<br />
<br />
;[http://socalfp.blogspot.com/ SoCal FP Group]<br />
<br />
;[http://bayfp.org/ The Bay Area Functional Programmers group]<br />
:Meeting monthly in the San Francisco Bay area. See [http://bayfp.org/blog their blog] for more details and news of upcoming meetings.<br />
<br />
;[http://groups.google.com/group/pdxfunc PDXfunc: Portland FP Group]<br />
:Monthly meetings of the Portland, Oregon functional programming group. Meetings occur on the second Monday of each month at 7 pm. They are held at [http://www.cubespacepdx.com CubeSpace] on 6th & Grant ([http://www.cubespacepdx.com/directions directions]), which generously provides the space free of charge. <br />
<br />
;[http://www.haskell.org/pipermail/haskell-cafe/2008-February/038991.html Seattle: Northwest Functional Programming Interest Group]<br />
:a Northwest Functional Programming Interest Group in Seattle.<br />
<br />
;[http://groups.google.com/group/hugvan Vancouver, Canada: Haskell Programmers Group]<br />
:Regular informal meetings for local Haskell programmers/devotees.<br />
<br />
====East Coast====<br />
<br />
;[http://article.gmane.org/gmane.comp.lang.haskell.cafe/21856 New York Functional Programmers Network]<br />
:Come and meet like-minded functional programmers in the New York area. The next meeting is at 6:30pm on February 26th, at Credit Suisse's offices. Paul Hudak from Yale will be giving a talk on real-time sound synthesis using Haskell. Please RSVP at the [http://lisp.meetup.com/59/ NYFPN Meetup Page].<br />
<br />
;[http://www.lisperati.com/fringedc.html FringeDC Washington]<br />
:Meetings about functional programming languages in Washington DC.<br />
<br />
====Central====<br />
<br />
;[http://leibnizdream.wordpress.com/2007/12/22/new-austin-functional-programmers-group-in-2008/ Austin Functional Programmers Group]<br />
:See the [http://groups.google.com/group/austin-fp discussion group] for more.<br />
<br />
;[http://groups.google.com/group/real-world-haskell-book-club/browse_thread/thread/3e8e59768c8c50a9 Colorado Area Haskell Study Group]<br />
<br />
===Australia===<br />
<br />
;[http://groups.google.com/group/fp-syd FP-SYD, the Sydney (Australia) Functional Programming group]<br />
:FP hackers in Sydney.<br />
<br />
;[http://sites.google.com/site/fpunion/ (FPU) Melbourne Functional Programming Union]<br />
:The FPU is a collective of functional programming language enthusiasts, which has been in operation since 1998. We are based at the University of Melbourne, in the Department of Computer Science and Software Engineering, but we are open to all members of the community. We meet on a regular basis for lively discussions on topics broadly associated with the declarative programming paradigm.<br />
<br />
===Europe===<br />
<br />
;[http://www.londonhug.net/ London Haskell User Group]<br />
:The first meeting of the London Haskell User Group took place on 23rd May 2007, at City University in central London<br />
<br />
;Haskell in Leipzig<br />
:Hal, they have videos [http://iba-cg.de/haskell.html online].<br />
<br />
;[http://users.ecs.soton.ac.uk/pocm06r/fpsig/ Southampton University FPSIG]<br />
:The Functional Programming Special Interest Group of the University of Southampton is a meeting for people interested in FP and Haskell and meet weekly on Tuesdays at 11.30, on the Access Grid Room of Blg. 32<br />
<br />
;[http://oasis.yi.org/oasis/HUGZ Haskell User Group Zurich]<br />
:A user group for the haskell users residing in Zurich and surroundings. It's new and still being formed.<br />
<br />
;[[IsraelHaskell]] User Group<br />
:[http://article.gmane.org/gmane.comp.lang.haskell.cafe/28877 Are getting organised].<br />
<br />
;[http://spbhug.folding-maps.org Saint-Petersburg Haskell User Group]<br />
:The next meeting will be held in April, 2008.<br />
<br />
;[[ItaloHaskell]]<br />
:We had a first meeting in August 2008 and we are planning a second one sometime during the 2008/2009 Autumn/Winter season.<br />
<br />
;[[Reykjavik Haskell User Group]] Iceland<br />
;[http://groups.google.com/group/haskell-is Currently recruiting members]<br />
<br />
;[http://groups.google.com/group/core-haskell?lnk=srg Turkey Haskell Programmer's Group]<br />
:Formed by Turkish Functional Programmers, the group began to communicate via an e-mail list opened by core.gen.tr. The first contribution is hlibev project by Aycan iRiCAN. <br />
<br />
;[[Dutch HUG]]<br />
:The Dutch HUG meets monthly in an informal setting.<br />
<br />
===South America===<br />
<br />
;[http://groups.google.com/group/hug-br HUG-BR]<br />
:Haskell Users' Group for Brasil<br />
<br />
===Asia===<br />
<br />
;[http://www.starling-software.com/en/tsac.html Tokyo Society for the Application of Currying]<br />
<br />
== Workshops/meet ups ==<br />
<br />
Less regular, and move around. Usually have a few talks from invited speakers.<br />
<br />
;[[AngloHaskell]]<br />
:AngloHaskell is a Haskell meeting held in England once a year.<br />
<br />
;[[OzHaskell]]<br />
:Australian Haskell Programmer's Group<br />
<br />
;[[AmeroHaskell]]<br />
:USAsian Haskell Programmer's Group<br />
<br />
;[http://taichi.ddns.comp.nus.edu.sg/taichiwiki/SingHaskell2007 SingHaskell]<br />
:Sing(apore)Haskell is a Haskell (and related languages) meeting in Singapore<br />
* [http://www.comp.nus.edu.sg/~sulzmann/singhaskell07/index.html slides]<br />
<br />
;[http://www.comp.mq.edu.au/~asloane/pmwiki.php/SAPLING/HomePage Sydney Area Programming Languages Interest Group]<br />
:10am-4pm, June 12, 2007. Room T5, Building E7B, Macquarie University<br />
<br />
;[http://www.cs.uu.nl/~johanj/FPDag2008/ Utrecht Functioneel Programmeren dag 2008]<br />
:11 januari 2008<br />
<br />
== Hackathons ==<br />
<br />
Getting together to squash bugs and write new stuff. For a more complete list, see [[Hackathon]].<br />
<br />
;[http://haskell.org/haskellwiki/Hac_2007 Hackathons]<br />
:Hac 07 was held January 10-12, 2007, Oxford University Computing Laboratory<br />
<br />
;[http://haskell.org/haskellwiki/HaL3 HaL3 Hackathon]<br />
:HaL3 was held Apr 19-20, 2008, Leipzig<br />
<br />
;[[Hac5]]<br />
:Hac5 was held 17-19 April 2009 in Utrecht.<br />
<br />
== Conferences ==<br />
<br />
See the [[Conferences]] page for academic workshops and conferences<br />
focusing on Haskell and related technology</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5/DinnerHac5/Dinner2009-04-19T15:41:17Z<p>MartijnVanSteenbergen: fixed</p>
<hr />
<div>== Dinner ==<br />
<br />
For sunday night, we will order asian food.<br />
<br />
Order before 18:00!<br />
<br />
== Options ==<br />
<br />
See http://tinyurl.com/hac5dinner<br />
<br />
If you order a one person meal you also have to choose whether you'd have white rice, nasi, bami, vegetarian nasi, vegetarian bami.<br />
<br />
== The List ==<br />
<br />
{| class="wikitable"<br />
! Name <br />
! Choice (number)<br />
! Rice/nasi/bami<br />
|-<br />
| David Himmelstrup<br />
| 700<br />
| Rice<br />
|-<br />
| Erik Hesselink<br />
| 701<br />
| nasi<br />
|-<br />
| Sebastiaan Visser<br />
| 704<br />
| nasi<br />
|-<br />
| Lennart Kolmodin<br />
| 700<br />
| Noodles<br />
|-<br />
| Reinier Lamers<br />
| 57<br />
|-<br />
| Eelco Lempsink<br />
| 58<br />
| 37<br />
|-<br />
| Rui Barbosa<br />
| 701<br />
| nasi<br />
|-<br />
| Eelco Dolstra<br />
| 701<br />
| bami<br />
|-<br />
| Andres Loeh<br />
| 704<br />
| rice<br />
|-<br />
| Sjoerd Visscher<br />
| 707<br />
| bami<br />
|-<br />
| David Waern<br />
| 700<br />
| Noodles<br />
|-<br />
| José Pedro Magalhães<br />
| 707<br />
| Nasi<br />
|-<br />
| Remi Turk<br />
| 702<br />
| Rijst<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5/DinnerHac5/Dinner2009-04-19T15:40:56Z<p>MartijnVanSteenbergen: added Remi's choice</p>
<hr />
<div>== Dinner ==<br />
<br />
For sunday night, we will order asian food.<br />
<br />
Order before 18:00!<br />
<br />
== Options ==<br />
<br />
See http://tinyurl.com/hac5dinner<br />
<br />
If you order a one person meal you also have to choose whether you'd have white rice, nasi, bami, vegetarian nasi, vegetarian bami.<br />
<br />
== The List ==<br />
<br />
{| class="wikitable"<br />
! Name <br />
! Choice (number)<br />
! Rice/nasi/bami<br />
|-<br />
| David Himmelstrup<br />
| 703<br />
| Rice<br />
|-<br />
| Erik Hesselink<br />
| 701<br />
| nasi<br />
|-<br />
| Sebastiaan Visser<br />
| 704<br />
| nasi<br />
|-<br />
| Lennart Kolmodin<br />
| 700<br />
| Noodles<br />
|-<br />
| Reinier Lamers<br />
| 57<br />
|-<br />
| Eelco Lempsink<br />
| 58<br />
| 37<br />
|-<br />
| Rui Barbosa<br />
| 701<br />
| nasi<br />
|-<br />
| Eelco Dolstra<br />
| 701<br />
| bami<br />
|-<br />
| Andres Loeh<br />
| 704<br />
| rice<br />
|-<br />
| Sjoerd Visscher<br />
| 707<br />
| bami<br />
|-<br />
| David Waern<br />
| 700<br />
| Noodles<br />
|-<br />
| José Pedro Magalhães<br />
| 707<br />
| Nasi<br />
|_<br />
| Remi Turk<br />
| 702<br />
| Rijst<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5/ProjectsHac5/Projects2009-04-19T15:15:27Z<p>MartijnVanSteenbergen: added Rui to list of hackers</p>
<hr />
<div>== Generic information ==<br />
<br />
You can apply for an account and a project using<br />
[http://community.haskell.org/admin/ the community server].<br />
<br />
Once you have an account and/or a project, you upload a Darcs repository as follows. First, initialize your repository on the server:<br />
<br />
$ ssh community.haskell.org<br />
you@haskell:~$ cd /srv/code/yourproject<br />
you@haskell:/srv/code/yourproject$ darcs init<br />
<br />
Then, log out and push your repository:<br />
<br />
$ darcs push community.haskell.org:/srv/code/yourproject<br />
<br />
== Demonstrations ==<br />
<br />
The following demos where held:<br />
<br />
* Jutaro, Leksah: the Haskell IDE<br />
* Don Stewart, vacuum + adaptive data structures<br />
* Tupil.com / chr1s: Real World Web Apps in Haskell<br />
* Thorkil Naur, interactive, time-sliced HPC code coverage<br />
* David Himmelstrup, the LHC Haskell Compiler.<br />
<br />
== Projects ==<br />
<br />
If you have a project that you want to work on at the Hackathon, please describe it here.<br />
<br />
Since Hackathons are great for teamwork, consider joining one of the projects mentioned below. If you're interested in one of these projects, add your name to the list of hackers under that project.<br />
<!-- Copy this template<br />
=== Project name ===<br />
<br />
==== Description ====<br />
<br />
I am a project. Love me.<br />
<br />
===== Hackers =====<br />
<br />
* Hacker 1<br />
* Hacker 2<br />
--><br />
<br />
=== Haskell Platform 1.0 ===<br />
<br />
Finish the construction and roll out of the new [http://www.haskell.org/pipermail/haskell/2009-March/021172.html Haskell Platform]<br />
<br />
==== Hackers ====<br />
<br />
* dcoutts<br />
* dons<br />
* Chris Eidhof (chr1s)<br />
* kolmodin<br />
<br />
Platform specified, generic unix tarball installer.<br />
<br />
=== Darcs Sprint #2 ===<br />
<br />
==== Description ====<br />
<br />
The [http://wiki.darcs.net/index.html/Sprints/2009-04 second Darcs Sprint]. Help improve our beloved [http://en.wikipedia.org/wiki/Distributed_revision_control DVCS]! Add your nick to the list.<br />
<br />
==== Hackers ====<br />
<br />
* Reinier Lamers (tux_rocker)<br />
* Eric Kow (kowey)<br />
* Ben Moseley (benmos)<br />
* Ganesh Sittampalam (Heffalump)<br />
* Ian Lynagh (igloo)<br />
* Arjan Boeijink (arjanb)<br />
* Benedikt Schmidt (beschmi)<br />
* Petr Ročkai (mornfall)<br />
* Thorkil Naur (thorkilnaur)<br />
<br />
=== Grapefruit ===<br />
<br />
==== Description ====<br />
<br />
[[Grapefruit]] is a library for [[Functional Reactive Programming]] (FRP) with a focus on user interfaces. FRP makes it possible to implement reactive and interactive systems in a declarative style. With Grapefruit, user interfaces are described as networks of communicating widgets and windows. Communication is done via different kinds of signals which describe temporal behavior.<br />
<br />
==== Possible subprojects ====<br />
<br />
* graphics support<br />
** Jeff Heard expressed interest in adapting [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/Hieroglyph Hieroglyph] to work with Grapefruit.<br />
** The classic version of Grapefruit contains quite a bit of OpenGL-based 3D animation stuff which could be ported to the current Grapefruit version.<br />
** We should also take a look at [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/rsagl RSAGL].<br />
* improvements of the UI part and the GTK+-based UI backend<br />
* Qt-based UI backend<br />
** [[HQK]] should be used for this.<br />
* addition or integration of some kind of physics engine<br />
** There is, for example, [[Hpysics]] from Roman Cheplyaka (Feuerbach)<br />
<br />
==== Licensing ====<br />
<br />
Grapefruit is BSD3-licensed, so all contributions to Grapefruit should be BSD3-licensed, too. If you don’t like this, please discuss this on the [http://projects.haskell.org/cgi-bin/mailman/listinfo/grapefruit Grapefruit mailing list] or contact [[User:Wolfgang Jeltsch|Wolfgang Jeltsch]].<br />
<br />
==== Hackers ====<br />
<br />
* Wolfgang Jeltsch (jeltsch)<br />
* Fraser Wilson<br />
* Roman Cheplyaka (Feuerbach)<br />
* Peter Verswyvelen<br />
* Thomas Davie<br />
<br />
There is a [http://www.doodle.com/hfcymxct953cpw7z doodle] for planning who is doing what.<br />
<br />
=== Leksah ===<br />
<br />
==== Description ====<br />
<br />
[http://leksah.org leksah] is an attempt to develop a Haskell IDE in Haskell. Help adding cool features to this Wannabee IDE, like:<br />
* Generate export list<br />
* Code Formatter<br />
* Infer types<br />
* ... <br />
<br />
==== Hackers ====<br />
<br />
* Jürgen Nicklisch (jutaro)<br />
<br />
<br />
=== Scion ===<br />
<br />
==== Description ====<br />
<br />
Scion is a library that aims to provide IDE-like functionality on top of the GHC API. It aims to be front-end agnostic, thus serve as a common middle-layer for various Haskell programming frontends like Emacs, Vim, Yi, Eclipse, etc.<br />
<br />
It currently only provides rudimentary functionality, such as loading a project and single-threaded background-typechecking. Currently, Scion's only frontend is Emacs, but a Vim frontend is in the underway. Possible Hackathon projects could be:<br />
<br />
* Extend Scion's capabilities. For example: cross-refs, jump to source, more type information, show haddock comments<br />
<br />
* Add another Scion frontend. E.g., hook up Yi or Eclipse with scion <br />
<br />
==== Hackers ====<br />
<br />
* Thomas Schilling (nominolo)<br />
* David Waern (waern)<br />
<br />
=== Type class aliases ===<br />
<br />
==== Description ====<br />
<br />
Type class aliases is a much wanted extension to Haskell proposed long ago by John Meacham ([http://repetae.net/recent/out/classalias.html John's website], [http://www.haskell.org/pipermail/haskell/2005-October/thread.html#16590 mailing list]) that has never been implemented yet. It is time this extension sees the light of day!<br />
<br />
GHC will be the target compiler. Perhaps GHC plugins ([http://hackage.haskell.org/trac/ghc/wiki/Plugins GHC wiki], [http://www.haskell.org/sitewiki/images/f/f0/TMR-Issue12.pdf The Monad Reader 12]) are of help here?<br />
<br />
Please have a look at the [[Context alias|context alias wiki page]] and extend it if you can.<br />
<br />
==== Ideas ====<br />
<br />
===== from Martijn van Steenbergen =====<br />
<br />
As a starting point we'll focus on supporting the following syntax:<br />
<br />
class alias FooBar a = (Foo a, Bar a)<br />
<br />
x :: FooBar a => a<br />
x = ...<br />
<br />
===== from Wolfgang Jeltsch =====<br />
<br />
A “class alias” actually doesn’t stand for a class but for a context (or a part of a context). So it might be better to choose a slightly different syntax:<br />
<br />
context Foobar a = (Foo a, Bar a)<br />
<br />
John Meacham proposes the following syntax for class aliases (context aliases) with superclass constraints:<br />
<br />
class alias Num a = Eq a => (Additive a, Multiplicative a)<br />
<br />
This is not consistent with the superclass syntax of class declarations. I think, we should use this syntax:<br />
<br />
class alias Eq a => Num a = (Additive a, Multiplicative a)<br />
<br />
Or better:<br />
<br />
context Eq a => Num a = (Additive a, Multiplicative a)<br />
<br />
==== Hackers ====<br />
<br />
* [[User:MartijnVanSteenbergen|Martijn van Steenbergen]]<br />
* [[User:sjoerd_visscher|Sjoerd Visscher]]<br />
* [[User:Basvandijk|Bas van Dijk]]<br />
* [[User:Roelvandijk|Roel van Dijk]]<br />
* Jeroen Leeuwestein<br />
* Remi Turk<br />
<br />
=== Goals in GHC(i) ===<br />
<br />
==== Description ====<br />
<br />
We will attempt to extend GHC(i) to give the type (and possibly context) of all 'undefined's in your code, similar to goals in Agda.<br />
<br />
==== Hackers ====<br />
<br />
* Sebastiaan Visser<br />
* Tom Lokhorst<br />
* Erik Hesselink<br />
* Rui Barbosa<br />
<br />
=== Containers: beyond Data.Map ===<br />
<br />
Scalable, adaptive persistent container types (Data.Map, Data.IntMap),<br />
<br />
* Don Stewart<br />
* Christophe Poucet<br />
* Nicolas Pouillard<br />
<br />
Summary of approach here: http://cpoucet.wordpress.com/2009/04/18/flattening-datamap/<br />
<br />
=== xmonad ===<br />
<br />
Some new extensions and developers.<br />
<br />
* Don Stewart<br />
* Nicolas Pouillard.<br />
<br />
=== Building a FastCGI interface for Happstack ===<br />
<br />
We've built a way to run Happstack applications on FastCGI, version 0.1.1 is now on hackage: [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/happstack-fastcgi happstack-fastcgi]<br />
<br />
Accompanying blogpost: http://blog.tupil.com/running-happstack-applications-with-fastcgi/<br />
<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
<br />
=== Yi ===<br />
<br />
Speed improvements and perhaps Scion integration.<br />
<br />
* David Waern<br />
* Scion integration: Figured out a design for where store and call<br />
callbacks for initializing and closing Scion. Next step is to figure out<br />
how to avoid circular module dependencies.<br />
* David Himmelstrup (Lemmih)<br />
<br />
=== Complexity ===<br />
<br />
I released version 0.1.1 of [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/complexity complexity], a small package to determine the algorithmic complexity of a function.<br />
<br />
* Roel van Dijk<br />
<br />
== Experiences ==<br />
<br />
Please list projects with which you are familiar. This way, people know whom to contact for more information or guidance on a particular project.<br />
<br />
{| class="wikitable"<br />
! Name<br />
! Projects<br />
|-<br />
| leather<br />
| [http://www.cs.uu.nl/wiki/GenericProgramming/EMGM EMGM], [http://www.cs.uu.nl/wiki/GenericProgramming/Multirec multirec]<br />
|-<br />
| jeltsch<br />
| [[Grapefruit]], [[HQK]]<br />
|-<br />
| jutaro<br />
| [http://www.leksah.org leksah]<br />
|-<br />
| sebas<br />
| [http://code.google.com/p/salvia-orchid/ salvia], [http://code.google.com/p/salvia-orchid/ orchid], filestore<br />
|-<br />
| waern<br />
| GHC (front-end), Haddock<br />
|-<br />
| Feuerbach<br />
| [http://xmonad.org xmonad], [[Hpysics]]<br />
|-<br />
| npouillard (ertai)<br />
| yi, xmonad, darcs<br />
|-<br />
| chr1s<br />
| formlets, sphinx, emgm, HAppS, EHC, web-related stuff<br />
|-<br />
| Lemmih<br />
| HAppS, LHC<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Hac5/ProjectsHac5/Projects2009-04-19T13:59:14Z<p>MartijnVanSteenbergen: added Remi to context synonym hacker list</p>
<hr />
<div>== Generic information ==<br />
<br />
You can apply for an account and a project using<br />
[http://community.haskell.org/admin/ the community server].<br />
<br />
Once you have an account and/or a project, you upload a Darcs repository as follows. First, initialize your repository on the server:<br />
<br />
$ ssh community.haskell.org<br />
you@haskell:~$ cd /srv/code/yourproject<br />
you@haskell:/srv/code/yourproject$ darcs init<br />
<br />
Then, log out and push your repository:<br />
<br />
$ darcs push community.haskell.org:/srv/code/yourproject<br />
<br />
== Projects ==<br />
<br />
If you have a project that you want to work on at the Hackathon, please describe it here.<br />
<br />
Since Hackathons are great for teamwork, consider joining one of the projects mentioned below. If you're interested in one of these projects, add your name to the list of hackers under that project.<br />
<!-- Copy this template<br />
=== Project name ===<br />
<br />
==== Description ====<br />
<br />
I am a project. Love me.<br />
<br />
===== Hackers =====<br />
<br />
* Hacker 1<br />
* Hacker 2<br />
--><br />
<br />
=== Haskell Platform 1.0 ===<br />
<br />
Finish the construction and roll out of the new [http://www.haskell.org/pipermail/haskell/2009-March/021172.html Haskell Platform]<br />
<br />
==== Hackers ====<br />
<br />
* dcoutts<br />
* dons<br />
* Chris Eidhof (chr1s)<br />
* needed: windows/ macosx packagers.<br />
* BAMSE + Cabal for Windows<br />
<br />
=== Darcs Sprint #2 ===<br />
<br />
==== Description ====<br />
<br />
The [http://wiki.darcs.net/index.html/Sprints/2009-04 second Darcs Sprint]. Help improve our beloved [http://en.wikipedia.org/wiki/Distributed_revision_control DVCS]! Add your nick to the list.<br />
<br />
==== Hackers ====<br />
<br />
* Reinier Lamers (tux_rocker)<br />
* Eric Kow (kowey)<br />
* Ben Moseley (benmos)<br />
* Ganesh Sittampalam (Heffalump)<br />
* Ian Lynagh (igloo)<br />
* Arjan Boeijink (arjanb)<br />
* Benedikt Schmidt (beschmi)<br />
* Petr Ročkai (mornfall)<br />
* Thorkil Naur (thorkilnaur)<br />
<br />
=== Grapefruit ===<br />
<br />
==== Description ====<br />
<br />
[[Grapefruit]] is a library for [[Functional Reactive Programming]] (FRP) with a focus on user interfaces. FRP makes it possible to implement reactive and interactive systems in a declarative style. With Grapefruit, user interfaces are described as networks of communicating widgets and windows. Communication is done via different kinds of signals which describe temporal behavior.<br />
<br />
==== Possible subprojects ====<br />
<br />
* graphics support<br />
** Jeff Heard expressed interest in adapting [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/Hieroglyph Hieroglyph] to work with Grapefruit.<br />
** The classic version of Grapefruit contains quite a bit of OpenGL-based 3D animation stuff which could be ported to the current Grapefruit version.<br />
** We should also take a look at [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/rsagl RSAGL].<br />
* improvements of the UI part and the GTK+-based UI backend<br />
* Qt-based UI backend<br />
** [[HQK]] should be used for this.<br />
* addition or integration of some kind of physics engine<br />
** There is, for example, [[Hpysics]] from Roman Cheplyaka (Feuerbach)<br />
<br />
==== Licensing ====<br />
<br />
Grapefruit is BSD3-licensed, so all contributions to Grapefruit should be BSD3-licensed, too. If you don’t like this, please discuss this on the [http://projects.haskell.org/cgi-bin/mailman/listinfo/grapefruit Grapefruit mailing list] or contact [[User:Wolfgang Jeltsch|Wolfgang Jeltsch]].<br />
<br />
==== Hackers ====<br />
<br />
* Wolfgang Jeltsch (jeltsch)<br />
* Fraser Wilson<br />
* Roman Cheplyaka (Feuerbach)<br />
* Peter Verswyvelen<br />
* Thomas Davie<br />
<br />
There is a [http://www.doodle.com/hfcymxct953cpw7z doodle] for planning who is doing what.<br />
<br />
=== Leksah ===<br />
<br />
==== Description ====<br />
<br />
[http://leksah.org leksah] is an attempt to develop a Haskell IDE in Haskell. Help adding cool features to this Wannabee IDE, like:<br />
* Generate export list<br />
* Code Formatter<br />
* Infer types<br />
* ... <br />
<br />
==== Hackers ====<br />
<br />
* Jürgen Nicklisch (jutaro)<br />
<br />
<br />
=== Scion ===<br />
<br />
==== Description ====<br />
<br />
Scion is a library that aims to provide IDE-like functionality on top of the GHC API. It aims to be front-end agnostic, thus serve as a common middle-layer for various Haskell programming frontends like Emacs, Vim, Yi, Eclipse, etc.<br />
<br />
It currently only provides rudimentary functionality, such as loading a project and single-threaded background-typechecking. Currently, Scion's only frontend is Emacs, but a Vim frontend is in the underway. Possible Hackathon projects could be:<br />
<br />
* Extend Scion's capabilities. For example: cross-refs, jump to source, more type information, show haddock comments<br />
<br />
* Add another Scion frontend. E.g., hook up Yi or Eclipse with scion <br />
<br />
==== Hackers ====<br />
<br />
* Thomas Schilling (nominolo)<br />
* David Waern (waern)<br />
<br />
=== Type class aliases ===<br />
<br />
==== Description ====<br />
<br />
Type class aliases is a much wanted extension to Haskell proposed long ago by John Meacham ([http://repetae.net/recent/out/classalias.html John's website], [http://www.haskell.org/pipermail/haskell/2005-October/thread.html#16590 mailing list]) that has never been implemented yet. It is time this extension sees the light of day!<br />
<br />
GHC will be the target compiler. Perhaps GHC plugins ([http://hackage.haskell.org/trac/ghc/wiki/Plugins GHC wiki], [http://www.haskell.org/sitewiki/images/f/f0/TMR-Issue12.pdf The Monad Reader 12]) are of help here?<br />
<br />
Please have a look at the [[Context alias|context alias wiki page]] and extend it if you can.<br />
<br />
==== Ideas ====<br />
<br />
===== from Martijn van Steenbergen =====<br />
<br />
As a starting point we'll focus on supporting the following syntax:<br />
<br />
class alias FooBar a = (Foo a, Bar a)<br />
<br />
x :: FooBar a => a<br />
x = ...<br />
<br />
===== from Wolfgang Jeltsch =====<br />
<br />
A “class alias” actually doesn’t stand for a class but for a context (or a part of a context). So it might be better to choose a slightly different syntax:<br />
<br />
context Foobar a = (Foo a, Bar a)<br />
<br />
John Meacham proposes the following syntax for class aliases (context aliases) with superclass constraints:<br />
<br />
class alias Num a = Eq a => (Additive a, Multiplicative a)<br />
<br />
This is not consistent with the superclass syntax of class declarations. I think, we should use this syntax:<br />
<br />
class alias Eq a => Num a = (Additive a, Multiplicative a)<br />
<br />
Or better:<br />
<br />
context Eq a => Num a = (Additive a, Multiplicative a)<br />
<br />
==== Hackers ====<br />
<br />
* [[User:MartijnVanSteenbergen|Martijn van Steenbergen]]<br />
* [[User:sjoerd_visscher|Sjoerd Visscher]]<br />
* [[User:Basvandijk|Bas van Dijk]]<br />
* [[User:Roelvandijk|Roel van Dijk]]<br />
* Jeroen Leeuwestein<br />
* Remi Turk<br />
<br />
=== Goals in GHC(i) ===<br />
<br />
==== Description ====<br />
<br />
We will attempt to extend GHC(i) to give the type (and possibly context) of all 'undefined's in your code, similar to goals in Agda.<br />
<br />
==== Hackers ====<br />
<br />
* Sebastiaan Visser<br />
* Tom Lokhorst<br />
* Erik Hesselink<br />
<br />
=== Containers: beyond Data.Map ===<br />
<br />
Brainstorm approaches for scalable, high performance, data-dense container structures. Adaptive tries, open addressed hashtables?<br />
<br />
* Don Stewart<br />
* Christophe Poucet<br />
* Nicolas Pouillard<br />
<br />
=== Numeric Array Types ===<br />
<br />
Finish API for uvector, based on Data.Text experiences.<br />
<br />
* Don Stewart<br />
<br />
=== xmonad ===<br />
<br />
Happy to help with xmonad advice<br />
<br />
* Don Stewart<br />
<br />
=== Building a FastCGI interface for Happstack ===<br />
<br />
We've built a way to run Happstack applications on FastCGI, the 0.1 is now on hackage: [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/happstack-fastcgi happstack-fastcgi]<br />
<br />
* Eelco Lempsink<br />
* Chris Eidhof<br />
<br />
=== Yi ===<br />
<br />
Speed improvements and perhaps Scion integration.<br />
<br />
* David Waern<br />
* David Himmelstrup (Lemmih)<br />
<br />
=== Complexity ===<br />
<br />
I released version 0.1.1 of complexity, a small package to determine the algorithmic complexity of a function.<br />
<br />
* Roel van Dijk<br />
<br />
== Experiences ==<br />
<br />
Please list projects with which you are familiar. This way, people know whom to contact for more information or guidance on a particular project.<br />
<br />
{| class="wikitable"<br />
! Name<br />
! Projects<br />
|-<br />
| leather<br />
| [http://www.cs.uu.nl/wiki/GenericProgramming/EMGM EMGM], [http://www.cs.uu.nl/wiki/GenericProgramming/Multirec multirec]<br />
|-<br />
| jeltsch<br />
| [[Grapefruit]], [[HQK]]<br />
|-<br />
| jutaro<br />
| [http://www.leksah.org leksah]<br />
|-<br />
| sebas<br />
| [http://code.google.com/p/salvia-orchid/ salvia], [http://code.google.com/p/salvia-orchid/ orchid], filestore<br />
|-<br />
| waern<br />
| GHC (front-end), Haddock<br />
|-<br />
| Feuerbach<br />
| [http://xmonad.org xmonad], [[Hpysics]]<br />
|-<br />
| npouillard (ertai)<br />
| yi, xmonad, darcs<br />
|-<br />
| chr1s<br />
| formlets, sphinx, emgm, HAppS, EHC, web-related stuff<br />
|-<br />
| Lemmih<br />
| HAppS, LHC<br />
|}</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Dutch_HUGDutch HUG2009-04-19T13:44:01Z<p>MartijnVanSteenbergen: slight rephrase</p>
<hr />
<div>[[Image:dhug.png|right]]<br />
<br />
The '''Dutch Haskell Users' Group''' meet monthly in an informal setting. The group was born on 19 April 2009 at [[Hac5]].<br />
<br />
== Mailing list ==<br />
<br />
A mailing list '''[http://groups.google.com/group/dutch-hug dutch-hug]''' is available at Google Groups.<br />
<br />
== Meetings ==<br />
<br />
The first meeting will be somewhere in Utrecht on '''6 May 2009''' at 19:30. Anyone is welcome to join; language used will be English, since the Haskell programmers in the Netherlands are multicultural. If you decide to attend, please add yourself to the [http://doodle.com/e4fx22ibbft8eurn list of attendees].<br />
<br />
We will probably meet in some café and have a fun evening. Do join us!</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Dutch_HUGDutch HUG2009-04-19T13:40:02Z<p>MartijnVanSteenbergen: added logo</p>
<hr />
<div>[[Image:dhug.png|right]]<br />
<br />
The '''Dutch Haskell Users' Group''' meet monthly in an informal setting. The group was born on 19 April 2009 on the last day of [[Hac5]].<br />
<br />
== Mailing list ==<br />
<br />
A mailing list '''[http://groups.google.com/group/dutch-hug dutch-hug]''' is available at Google Groups.<br />
<br />
== Meetings ==<br />
<br />
The first meeting will be somewhere in Utrecht on '''6 May 2009''' at 19:30. Anyone is welcome to join; language used will be English, since the Haskell programmers in the Netherlands are multicultural. If you decide to attend, please add yourself to the [http://doodle.com/e4fx22ibbft8eurn list of attendees].<br />
<br />
We will probably meet in some café and have a fun evening. Do join us!</div>MartijnVanSteenbergenhttps://wiki.haskell.org/File:Dhug.pngFile:Dhug.png2009-04-19T13:37:56Z<p>MartijnVanSteenbergen: Logo for the Dutch Haskell Users' Group</p>
<hr />
<div>Logo for the Dutch Haskell Users' Group</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Dutch_HUGDutch HUG2009-04-19T13:36:18Z<p>MartijnVanSteenbergen: fixed link</p>
<hr />
<div>The '''Dutch Haskell Users' Group''' meet monthly in an informal setting. The group was born on 19 April 2009 on the last day of [[Hac5]].<br />
<br />
== Mailing list ==<br />
<br />
A mailing list '''[http://groups.google.com/group/dutch-hug dutch-hug]''' is available at Google Groups.<br />
<br />
== Meetings ==<br />
<br />
The first meeting will be somewhere in Utrecht on '''6 May 2009''' at 19:30. Anyone is welcome to join; language used will be English, since the Haskell programmers in the Netherlands are multicultural. If you decide to attend, please add yourself to the [http://doodle.com/e4fx22ibbft8eurn list of attendees].<br />
<br />
We will probably meet in some café and have a fun evening. Do join us!</div>MartijnVanSteenbergenhttps://wiki.haskell.org/Dutch_HUGDutch HUG2009-04-19T13:35:44Z<p>MartijnVanSteenbergen: initial draft</p>
<hr />
<div>The '''Dutch Haskell Users' Group''' meet monthly in an informal setting. The group was born on 19 April 2009 on the last day of [Hac5].<br />
<br />
== Mailing list ==<br />
<br />
A mailing list '''[http://groups.google.com/group/dutch-hug dutch-hug]''' is available at Google Groups.<br />
<br />
== Meetings ==<br />
<br />
The first meeting will be somewhere in Utrecht on '''6 May 2009''' at 19:30. Anyone is welcome to join; language used will be English, since the Haskell programmers in the Netherlands are multicultural. If you decide to attend, please add yourself to the [http://doodle.com/e4fx22ibbft8eurn list of attendees].<br />
<br />
We will probably meet in some café and have a fun evening. Do join us!</div>MartijnVanSteenbergen