https://wiki.haskell.org/api.php?action=feedcontributions&user=PaoloMartini&feedformat=atomHaskellWiki - User contributions [en]2022-08-13T15:23:33ZUser contributionsMediaWiki 1.31.7https://wiki.haskell.org/index.php?title=AngloHaskell/2007&diff=14814AngloHaskell/20072007-08-02T14:07:34Z<p>PaoloMartini: added myself</p>
<hr />
<div>On June the 9th 2006, Microsoft Research sent out an advert for a job. This eventually led to [[AngloHaskell/2006|AngloHaskell 2006]], and much fun was had!<br />
<br />
Doing it again in 2007 seems like a good idea, who's up for it?<br />
<br />
Local contact: Duncan Coutts, +44 7913 261 613, backup Ganesh Sittampalam +44 7968 253467<br />
<br />
Organisational contact: Neil Mitchell, +44 7876 126 574<br />
<br />
== Date and Venue ==<br />
<br />
Confirmed! We're going with the 10th-11th of August in Cambridge, starting with talks at Microsoft Research and with more planning to happen below.<br />
<br />
Many thanks to Matthew Sackman for offering us an alternative venue! Perhaps we can try it next year?<br />
<br />
Yes, I'll still be at Imperial then so I can't see why not! [[User:MatthewSackman|MatthewSackman]]<br />
<br />
Edit: That's Cambridge in England. Yes, we have been asked this.<br />
<br />
=== Directions to MSR ===<br />
<br />
MSR has [http://research.microsoft.com/aboutmsr/visitmsr/cambridge/directions.aspx some directions], which can be best summarised as ‘get a taxi’. Here is (hopefully) a [http://earth.google.com/ Google Earth] [[Media:Microsoft_Research,_Cambridge.kmz|location]] of MSR, as well as a [http://maps.google.com/maps?q=CB3+0FB&ll=52.211499,0.117073&spn=0.02677,0.086517 Google Maps link]. (J J Thomson Avenue is immediately west of Clerk Maxwell Road.)<br />
<br />
If you do take a taxi and the driver doesn't know where it is, tell him or her to drive down Madingley Road until you reach the West Cambridge site, J J Thomson Avenue. The Computer Laboratory (next door) has [http://www.cl.cam.ac.uk/UoCCL/contacts/#gettinghere marginally better instructions].<br />
<br />
The fastest way to MSR (on foot and public transport) from the station is to [http://maps.google.com/maps?saddr=CB1+2JW&daddr=Trumpington+Road,+Cambridge cut through to Trumpington Road via Bateman Street] (don't follow the driving directions!), and take the Citi 4 or Uni 4. There's a bus stop just across the road from Bateman Street.<br />
<br />
To get to the city centre by bus, take the Citi 1 or Citi 3. Do ask to make sure they're going in the right direction though! There are also a number of clearly marked shuttle busses between the centre and station running during the day every 10 minutes or so.<br />
<br />
To walk to the centre (20 minutes not carrying luggage), go straight down the road facing you when you come out of the station, bear right when the road ends at some traffic lights / a WW1 memorial / the botanic gardens, and keep walking straight (Hills Road / Regent St / St Andrews St) for quite a while until you reach a pedestrianised bit, at which point you are in the centre.<br />
<br />
From the city centre to MSR, you can catch the number 77 Madingley Road Park and Ride which goes from bus stop M on Emma St. (Or find your way to Pembroke or Silver Street, and catch the Citi 4 / Uni 4 from there.) (Note that the 77 doesn't stop by MSR any more, it goes to the park and ride from which you have to walk back, 10-15 mins. This caught me out the other day --SimonM).<br />
<br />
==== Parking ====<br />
<br />
Some parking spaces will be available around the back of the MSR building. To get out again, drivers will need to talk to reception to obtain a token.<br />
<br />
== Attendees ==<br />
<br />
Per last year, all attendees should '''bring or make a nametag''' that identifies you by your real name and/or IRC name. If anyone wants to drag a roll of stickers and a pen along that'll help!<br />
<br />
If you can't make the start on Friday, or can only make it on Saturday, that's fine. If you're not sure where everyone's going to be, give one of the contacts a call or a text.<br />
<br />
Duncan Coutts has volunteered to act as local contact, with Ganesh Sittampalam as backup. Thanks guys!<br />
<br />
=== Definite ===<br />
<br />
* Philippa Cowderoy<br />
* Neil Mitchell<br />
* Simon Peyton Jones (leaving for vacation on Saturday though)<br />
* [http://www.dysfunctor.org/ Peter McArthur]<br />
* Chris Smith (cdsmith)<br />
* Duncan Coutts<br />
* Simon Marlow<br />
* Ganesh Sittampalam<br />
* [http://claudiusmaximus.goto10.org/ Claude Heiland-Allen]<br />
* Paolo Martini<br />
<br />
=== Possible ===<br />
<br />
* Ben Moseley<br />
* Alex McLean - looks like i might not be able to make it now :/<br />
* Ian Lynagh<br />
* Edwin Brady<br />
* Titto (if it is in September)<br />
* Sebastian Sylvan - interested. It depends on the talks. I'm sure all the talks listed so far will be interesting, but if we can get one or two of the "big names" to give a talk, then it's a surefire guarantee that it'll be worth coming for, and then other talks would be icing on the cake! Personally I'm very interested in the concurrency/parallelism stuff that's going on currently (so if anyone reading this has something to say on that, sign up!). Also, might be worhtwhile to synchronise it with a bank holiday so people don't have to take a day off?<br />
* Lennart Augustsson - I can probably make August 10-11, otherwise early September.<br />
* Matthew Sackman - it's unlikely I won't be there.<br />
* Ben Lippmeier - If it's at MSR then I'm already there.<br />
* Andy Gimblett<br />
* Tom Parslow - Sounds fun, hopefully will be there<br />
* Magnus Therning<br />
* Alan Mock<br />
<br />
== Lodging ==<br />
<br />
It's likely that there'll be people in need of crashspace and so forth, so please organise here! Both offers and requests are good.<br />
<br />
=== Crashspace Requests ===<br />
<br />
* Claude Heiland-Allen<br />
* Andy Gimblett, though I'm trying to make an alternative arrangement (and bring my wife :) )<br />
<br />
=== Nearby Colleges ===<br />
<br />
Many of undergraduate colleges (which are really glorified halls of residence) offer cheap accommodation over the holidays. Locations near MSR include Churchill College, Wolfson Court (an annexe of Girton College), Fitzwillian College, Robinson College, New Hall (female only) and Burwells Field (an annexe of Trinity College).<br />
<br />
[http://www.cam.ac.uk/map/v4/drawmap.cgi?mp=main;xx=900;yy=560;mt=c;mx=759;my=467;ms=75;tl=Microsoft%20Research This map] might prove useful.<br />
<br />
-- [http://www.dysfunctor.org/ Peter McArthur]<br />
<br />
=== Hostels ===<br />
<br />
There's a fairly inexpensive [http://www.yha.org.uk/find-accommodation/east-of-england/hostels/cambridge/index.aspx YHA hostel] in Cambridge. There may be others.<br />
<br />
== Programme ==<br />
<br />
Planning will be taking place on IRC as per last year: #anglohaskell on irc.freenode.net<br />
<br />
If you're having trouble following things on IRC, the discussion page on the wiki might be a good place to leave comments and questions.<br />
<br />
Last year we had talks in the day on a Friday, followed by pubbage in the evening and assorted activities on the Saturday. This seemed to work, so we'll follow a similar model this year.<br />
<br />
=== Talks ===<br />
<br />
Philippa will be arriving at MSR around 10am, with tea, coffee and biscuits available from 10:30am. There'll be a sandwich lunch available (time to be confirmed around the talks) and another coffee etc break sometime between 3 and 4. We'll also end with an 'open' session in which people can grab a whiteboard and talk for 10-15 minutes on whatever takes their fancy - see below!<br />
<br />
Volunteers please! Last year we had a largely more practical set of talks than you might find at Fun in the Afternoon or an academic event. This was a good thing, and some of the best talks were from people who were far from considering themselves as experts, so feel free to tell us about your experiences.<br />
<br />
Talks planned and/or offered:<br />
<br />
* Philippa Cowderoy - my experiences with Haskell as a person with Asperger's Syndrome - CONFIRMED<br />
* Neil Mitchell - Making Haskell Faster - CONFIRMED<br />
* Claude Heiland-Allen - maybe something on embedding Haskell inside the multimedia software [http://puredata.info Pure-data] - CONFIRMED<br />
* Alex McLean - something related to improvising live music with Haskell - I need to sort out my schedule but am not sure if I can get to cambridge for the friday now :(<br />
* Lennart Augustsson - I could have my arm twisted enough to give a talk.<br />
* Ben Lippmeier - effect inference and optimisation, like at [http://www.comp.mq.edu.au/~asloane/pmwiki.php/SAPLING/SAPLING071 SAPLING]<br />
<br />
So far, we know that Neil's talk is going to happen towards the end of the morning before lunch, Philippa's will be in the afternoon. We have some additional offers that may come through as well.<br />
<br />
If anyone has any dietary requirements, could they add them here before Friday the 3rd? Lunch'll be sandwiches, I'm told vegetarians should be okay either way.<br />
<br />
==== Timetable ====<br />
<br />
This is somewhat preliminary and subject to change as talks are confirmed or otherwise, but the overall structure should hold: <br />
<br />
{| class="wikitable"<br />
|-<br />
! Time !! Event<br />
|-<br />
| 10am || Philippa arrives at MS Research<br />
|-<br />
| 10:30 am || Tea, coffee and biscuits<br />
|-<br />
| 11am || Keynote from Neil and Philippa<br />
|-<br />
| shortly after || Talks<br />
|-<br />
| ~12:30 pm || Neil Mitchell - Making Haskell Faster<br />
|-<br />
| 1pm || Lunch<br />
|-<br />
| 2pm || Philippa Cowderoy - Experiences with Haskell as a person with Asperger's<br />
|-<br />
| 2:30pm || More talks<br />
|-<br />
| 3:30pm || Tea, coffee and biscuits<br />
|-<br />
| 4pm || Talk<br />
|-<br />
| 4:30pm || Functional grit - small talks that may grow into functional pearls. Open session, anyone can give a quick talk!<br />
|-<br />
| When people get hungry or MSR kick us out || Food! Likely we'll head out for a curry<br />
|-<br />
| Beer o'Clock || When everyone's finished eating, we'll head for a nearby pub<br />
|}<br />
<br />
==== Abstracts ====<br />
<br />
* Neil Mitchell - Making Haskell Faster <p>In Haskell there is sometimes a tension between declarative high-level programs, and high-performance programs. This talk discusses a whole-program optimisation for Haskell, which can transform a high-level program into a very low-level performance orientated one.</p><br />
<br />
* Claude Heiland-Allen - Extending Pure-data with Haskell <p>Pure-data (Pd) is a real-time graphical programming environment for multimedia processing. Pd has a ''stateful objects and message passing'' paradigm, and additional object classes can be written in C (Pd native), C++, Python, Scheme, Ruby, and possibly others (through extra plugins). This talk will be about the trials and tribulations of adding Haskell support to Pure-data.</p><br />
<br />
=== Other activity ===<br />
<br />
After Friday's talks, food and drink would be a good idea!<br />
<br />
I suggest we go to [http://www.beerintheevening.com/pubs/s/13/1361/Regal/Cambridge The Regal] for brunch on Saturday to kick off with. That's the Wetherspoons from last year. After that, punting again if it's not raining too much? Any suggestions for if it's wet?<br />
<br />
I'd like it if we can eat at a restaurant before finding a pub for the evening on friday. Borrowing Fun in the Afternoon's post-talks curry works if nobody's got any other suggestions - [[User:PhilippaCowderoy|PhilippaCowderoy]]<br />
<br />
== Wifi at MSR ==<br />
<br />
Once again, MSR is willling to provide wireless internet to everyone who gives their name and email address (and where appropriate, company/institution name) - this time by Friday the 3rd of August. Feel free to add your details even if you're not sure you're coming!<br />
<br />
* Philippa Cowderoy (flippa@flippac.org)<br />
* Ganesh Sittampalam (ganesh@earth.li, Credit Suisse)<br />
* Alan Mock (docmach@gmail.com)<br />
* Chris Smith (cdsmith@twu.net)<br />
* Lennart Augustsson (lennart@augustsson.net, Credit Suisse)<br />
* Claude Heiland-Allen (claudiusmaximus@goto10.org, GOTO10)<br />
* Andy Gimblett (a.m.gimblett@swan.ac.uk, Swansea University)<br />
* Paolo Martini (ponkje at gmail dot com)<br />
<br />
== Wiki organisation ==<br />
<br />
This isn't really a major point, but: it seems to me that keeping about the pages used to organise previous events is a good idea as things go on, and that this page should be used both to link to the archives and contain the current discussion. Anyone take issue with this?<br />
<br />
[[Category:Events]]</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=11026User:PaoloMartini2007-02-04T20:07:30Z<p>PaoloMartini: more randoms</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell><br />
<br />
== Catamorfism on a binary tree ==<br />
<br />
Replacing systematically the data constructors with an evaluation function.<br />
<br />
<haskell><br />
data Tree a = Leaf a<br />
| Branch (Tree a) (Tree a)<br />
<br />
cata :: (a -> r, r -> r -> r) -> Tree a -> r<br />
cata (f1,f2) (Leaf x) = f1 x<br />
cata (f1,f2) (Branch b1 b2) = f2 (cata (f1,f2) b1) (cata (f1,f2) b2)<br />
</haskell><br />
<br />
<br />
== Fibonacci (type-)numbers ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module Fibonacci where<br />
<br />
data Zero<br />
data Succ n<br />
type One = Succ Zero<br />
<br />
class Add a b c | a b -> c where<br />
add :: a -> b -> c<br />
<br />
instance Add Zero n n<br />
instance Add a b c => Add (Succ a) b (Succ c)<br />
<br />
class Fib n m | n -> m where<br />
fib :: n -> m<br />
<br />
instance Fib Zero Zero<br />
instance Fib One One<br />
instance (Fib n a, Fib (Succ n) b, Add a b c) => Fib (Succ (Succ n)) c<br />
</haskell><br />
<br />
== Points-free hylomorphism ==<br />
<br />
<haskell><br />
module Refold where<br />
<br />
fold f n [ ] = n<br />
fold f n (x:xs) = f x (fold f n xs)<br />
<br />
unfold p f g x = if p x then [] else f x : unfold p f g (g x)<br />
<br />
{-<br />
refold c n p f g = fold c n . unfold p f g<br />
refold c n p f = (fold c n .) . unfold p f<br />
refold c n p = ((fold c n .) .) . unfold p<br />
refold c n = (((fold c n .) .) .) . unfold<br />
refold c n = (\x -> (((x .) .) .) . unfold) fold c n<br />
refold c = (\x -> (((x .) .) .) . unfold) . fold c<br />
refold = ((\x -> (((x .) .) .) . unfold) .) . fold<br />
refold = ((\x -> (.) (((x .) .) .) unfold) .) . fold<br />
refold = ((\x -> flip (.) unfold (((x .) .) .)) .) . fold<br />
refold = ((\x -> flip (.) unfold . (\x -> (.) ((.) ((.) x))) $ x) .) . fold<br />
refold = ((flip (.) unfold . ((.) . (.) . (.))) .) . fold<br />
-}<br />
<br />
refold = ((flip (.) unfold . (.) . (.) . (.)) .) . fold<br />
</haskell><br />
<br />
== Roman (type-)numerals ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Romans where<br />
<br />
class Roman t where<br />
roman :: t -> Int<br />
<br />
data O -- 0<br />
data I a -- 1<br />
data V a -- 5<br />
data X a -- 10<br />
data L a -- 50<br />
data C a -- 100<br />
data D a -- 500<br />
data M a -- 1000<br />
<br />
instance Roman O where roman _ = 0<br />
instance Roman (I O) where roman _ = 1<br />
instance Roman (V O) where roman _ = 5<br />
instance Roman (X O) where roman _ = 10<br />
<br />
instance Roman (I a) => Roman (I (I a)) where roman _ = roman (undefined :: (I a)) + 1<br />
instance Roman a => Roman (I (V a)) where roman _ = roman (undefined :: a) + 4<br />
instance Roman a => Roman (I (X a)) where roman _ = roman (undefined :: a) + 9<br />
<br />
instance Roman (I a) => Roman (V (I a)) where roman _ = roman (undefined :: (I a)) + 5<br />
instance Roman (V a) => Roman (V (V a)) where roman _ = roman (undefined :: (V a)) + 5<br />
<br />
instance Roman (I a) => Roman (X (I a)) where roman _ = roman (undefined :: (I a)) + 10<br />
instance Roman (V a) => Roman (X (V a)) where roman _ = roman (undefined :: (V a)) + 10<br />
instance Roman (X a) => Roman (X (X a)) where roman _ = roman (undefined :: (X a)) + 10<br />
instance Roman a => Roman (X (L a)) where roman _ = roman (undefined :: a) + 40<br />
instance Roman a => Roman (X (C a)) where roman _ = roman (undefined :: a) + 90<br />
instance Roman a => Roman (X (D a)) where roman _ = roman (undefined :: a) + 490<br />
<br />
instance Roman a => Roman (L a) where roman _ = roman (undefined :: a) + 50<br />
<br />
instance Roman (I a) => Roman (C (I a)) where roman _ = roman (undefined :: (I a)) + 100<br />
instance Roman (V a) => Roman (C (V a)) where roman _ = roman (undefined :: (V a)) + 100<br />
instance Roman (X a) => Roman (C (X a)) where roman _ = roman (undefined :: (X a)) + 100<br />
instance Roman (L a) => Roman (C (L a)) where roman _ = roman (undefined :: (L a)) + 100<br />
instance Roman (C a) => Roman (C (C a)) where roman _ = roman (undefined :: (C a)) + 100<br />
instance Roman a => Roman (C (D a)) where roman _ = roman (undefined :: a) + 400<br />
instance Roman a => Roman (C (M a)) where roman _ = roman (undefined :: a) + 900<br />
<br />
instance Roman a => Roman (D a) where roman _ = roman (undefined :: a) + 500<br />
<br />
instance Roman a => Roman (M a) where roman _ = roman (undefined :: a) + 1000<br />
<br />
powersoftwo = [roman (undefined :: (I (I O))),<br />
roman (undefined :: (I (V O))),<br />
roman (undefined :: (V (I (I (I O))))),<br />
roman (undefined :: (X (V (I O)))),<br />
roman (undefined :: (X (X (X (I (I O)))))),<br />
roman (undefined :: (L (X (I (V O))))),<br />
roman (undefined :: (C (X (X (V (I (I (I O)))))))),<br />
roman (undefined :: (C (C (L (V (I O)))))),<br />
roman (undefined :: (D (X (I (I O))))),<br />
roman (undefined :: (M (X (X (I (V O)))))),<br />
roman (undefined :: (M (M (X (L (V (I (I (I O)))))))))]<br />
</haskell><br />
<br />
<br />
== Randoms ==<br />
<br />
<haskell><br />
randoms :: (Random a, RandomGen g) => g -> [a]<br />
randoms = fix ((. next) . uncurry . (. (:)) . flip (.))<br />
randoms = unfoldr (Just . random)<br />
randomsR :: (Random a, RandomGen g) => (a,a) -> g -> [a]<br />
randomsR range = unfoldr (Just . randomR range)<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=9013User:PaoloMartini2006-12-10T19:50:12Z<p>PaoloMartini: randoms</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell><br />
<br />
== Catamorfism on a binary tree ==<br />
<br />
Replacing systematically the data constructors with an evaluation function.<br />
<br />
<haskell><br />
data Tree a = Leaf a<br />
| Branch (Tree a) (Tree a)<br />
<br />
cata :: (a -> r, r -> r -> r) -> Tree a -> r<br />
cata (f1,f2) (Leaf x) = f1 x<br />
cata (f1,f2) (Branch b1 b2) = f2 (cata (f1,f2) b1) (cata (f1,f2) b2)<br />
</haskell><br />
<br />
<br />
== Fibonacci (type-)numbers ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module Fibonacci where<br />
<br />
data Zero<br />
data Succ n<br />
type One = Succ Zero<br />
<br />
class Add a b c | a b -> c where<br />
add :: a -> b -> c<br />
<br />
instance Add Zero n n<br />
instance Add a b c => Add (Succ a) b (Succ c)<br />
<br />
class Fib n m | n -> m where<br />
fib :: n -> m<br />
<br />
instance Fib Zero Zero<br />
instance Fib One One<br />
instance (Fib n a, Fib (Succ n) b, Add a b c) => Fib (Succ (Succ n)) c<br />
</haskell><br />
<br />
== Points-free hylomorphism ==<br />
<br />
<haskell><br />
module Refold where<br />
<br />
fold f n [ ] = n<br />
fold f n (x:xs) = f x (fold f n xs)<br />
<br />
unfold p f g x = if p x then [] else f x : unfold p f g (g x)<br />
<br />
{-<br />
refold c n p f g = fold c n . unfold p f g<br />
refold c n p f = (fold c n .) . unfold p f<br />
refold c n p = ((fold c n .) .) . unfold p<br />
refold c n = (((fold c n .) .) .) . unfold<br />
refold c n = (\x -> (((x .) .) .) . unfold) fold c n<br />
refold c = (\x -> (((x .) .) .) . unfold) . fold c<br />
refold = ((\x -> (((x .) .) .) . unfold) .) . fold<br />
refold = ((\x -> (.) (((x .) .) .) unfold) .) . fold<br />
refold = ((\x -> flip (.) unfold (((x .) .) .)) .) . fold<br />
refold = ((\x -> flip (.) unfold . (\x -> (.) ((.) ((.) x))) $ x) .) . fold<br />
refold = ((flip (.) unfold . ((.) . (.) . (.))) .) . fold<br />
-}<br />
<br />
refold = ((flip (.) unfold . (.) . (.) . (.)) .) . fold<br />
</haskell><br />
<br />
== Roman (type-)numerals ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Romans where<br />
<br />
class Roman t where<br />
roman :: t -> Int<br />
<br />
data O -- 0<br />
data I a -- 1<br />
data V a -- 5<br />
data X a -- 10<br />
data L a -- 50<br />
data C a -- 100<br />
data D a -- 500<br />
data M a -- 1000<br />
<br />
instance Roman O where roman _ = 0<br />
instance Roman (I O) where roman _ = 1<br />
instance Roman (V O) where roman _ = 5<br />
instance Roman (X O) where roman _ = 10<br />
<br />
instance Roman (I a) => Roman (I (I a)) where roman _ = roman (undefined :: (I a)) + 1<br />
instance Roman a => Roman (I (V a)) where roman _ = roman (undefined :: a) + 4<br />
instance Roman a => Roman (I (X a)) where roman _ = roman (undefined :: a) + 9<br />
<br />
instance Roman (I a) => Roman (V (I a)) where roman _ = roman (undefined :: (I a)) + 5<br />
instance Roman (V a) => Roman (V (V a)) where roman _ = roman (undefined :: (V a)) + 5<br />
<br />
instance Roman (I a) => Roman (X (I a)) where roman _ = roman (undefined :: (I a)) + 10<br />
instance Roman (V a) => Roman (X (V a)) where roman _ = roman (undefined :: (V a)) + 10<br />
instance Roman (X a) => Roman (X (X a)) where roman _ = roman (undefined :: (X a)) + 10<br />
instance Roman a => Roman (X (L a)) where roman _ = roman (undefined :: a) + 40<br />
instance Roman a => Roman (X (C a)) where roman _ = roman (undefined :: a) + 90<br />
instance Roman a => Roman (X (D a)) where roman _ = roman (undefined :: a) + 490<br />
<br />
instance Roman a => Roman (L a) where roman _ = roman (undefined :: a) + 50<br />
<br />
instance Roman (I a) => Roman (C (I a)) where roman _ = roman (undefined :: (I a)) + 100<br />
instance Roman (V a) => Roman (C (V a)) where roman _ = roman (undefined :: (V a)) + 100<br />
instance Roman (X a) => Roman (C (X a)) where roman _ = roman (undefined :: (X a)) + 100<br />
instance Roman (L a) => Roman (C (L a)) where roman _ = roman (undefined :: (L a)) + 100<br />
instance Roman (C a) => Roman (C (C a)) where roman _ = roman (undefined :: (C a)) + 100<br />
instance Roman a => Roman (C (D a)) where roman _ = roman (undefined :: a) + 400<br />
instance Roman a => Roman (C (M a)) where roman _ = roman (undefined :: a) + 900<br />
<br />
instance Roman a => Roman (D a) where roman _ = roman (undefined :: a) + 500<br />
<br />
instance Roman a => Roman (M a) where roman _ = roman (undefined :: a) + 1000<br />
<br />
powersoftwo = [roman (undefined :: (I (I O))),<br />
roman (undefined :: (I (V O))),<br />
roman (undefined :: (V (I (I (I O))))),<br />
roman (undefined :: (X (V (I O)))),<br />
roman (undefined :: (X (X (X (I (I O)))))),<br />
roman (undefined :: (L (X (I (V O))))),<br />
roman (undefined :: (C (X (X (V (I (I (I O)))))))),<br />
roman (undefined :: (C (C (L (V (I O)))))),<br />
roman (undefined :: (D (X (I (I O))))),<br />
roman (undefined :: (M (X (X (I (V O)))))),<br />
roman (undefined :: (M (M (X (L (V (I (I (I O)))))))))]<br />
</haskell><br />
<br />
<br />
== randoms ==<br />
<br />
<haskell><br />
randoms :: (RandomGen g) => g -> [Int]<br />
randoms = fix ((. next) . uncurry . (. (:)) . flip (.))<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=6033User talk:PaoloMartini2006-09-15T20:41:40Z<p>PaoloMartini: </p>
<hr />
<div><math>p(x) = \sum_{i=0}^n a_i x^i, a_n \neq 0 </math><br />
<br />
<math>p(x) = a_n x^n + \sum_{i=0}^{n-1} a_i x^i </math><br />
<br />
<math>p(x-1) = a_n (x-1)^n + \sum_{i=0}^{n-1} a_i (x-1)^i </math><br />
<br />
<math>(x-1)^n = \sum_{k=0}^n {n \choose k} x^{n-k} (-1)^k </math><br />
<br />
<math>p(x-1) = a_n \sum_{k=0}^n {n \choose k} x^{n-k} (-1)^k + \sum_{i=0}^{n-1} a_i (x-1)^i </math><br />
<br />
<math>p(x-1) = a_n x^n + a_n \sum_{k=1}^n {n \choose k} x^{n-k} (-1)^k + \sum_{i=0}^{n-1} a_i (x-1)^i </math><br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Polynomial where<br />
<br />
import Test.QuickCheck<br />
<br />
-- *f*actorial<br />
f :: Integer -> Integer<br />
f n = product [1..n]<br />
<br />
-- *c*hoose -- binomial coefficient<br />
c :: Integer -> Integer -> Integer<br />
n `c` k = f n `div` (f k * f (n-k))<br />
<br />
-- *p*olynomial<br />
p, q :: [Integer] -> Integer -> Integer<br />
p a x = sum [(a!!fromIntegral i)*(x^i) | i <- [0..n]] where n = length a - 1<br />
<br />
q a x = ((a!!n) * ((x+1)^n))<br />
+ ((a!!n) * sum [(fromIntegral n `c` fromIntegral k)*((x+1)^(n-k))*((-1)^k) | k <- [1..n]])<br />
+ sum [(a!!fromIntegral i)*(x^i) | i <- [0..n-1]] where n = length a - 1<br />
<br />
-- *t*est<br />
t = quickCheck $ \(x::Integer) (xs::[Integer]) -><br />
not (null xs) && last xs /= 0 ==> p xs x == q xs x<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=6032User talk:PaoloMartini2006-09-15T20:14:53Z<p>PaoloMartini: </p>
<hr />
<div><math>p(x) = \sum_{i=0}^n a_i x^i, a_n \neq 0 </math><br />
<br />
<math>p(x) = a_n x^n + \sum_{i=0}^{n-1} a_i x^i </math><br />
<br />
<math>p(x-1) = a_n (x-1)^n + \sum_{i=0}^{n-1} a_i (x-1)^i </math><br />
<br />
<math>(x-1)^n = \sum_{k=0}^n {n \choose k} x^{n-k} (-1)^k </math><br />
<br />
<math>p(x-1) = a_n \sum_{k=0}^n {n \choose k} x^{n-k} (-1)^k + \sum_{i=0}^{n-1} a_i (x-1)^i </math><br />
<br />
<math>p(x-1) = a_n x^n + a_n \sum_{k=1}^n {n \choose k} x^{n-k} (-1)^k + \sum_{i=0}^{n-1} a_i (x-1)^i </math></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5993User talk:PaoloMartini2006-09-14T22:28:23Z<p>PaoloMartini: </p>
<hr />
<div><math>\sum_{i=0}^n a_i \sum_{j=0}^i {n \choose k} x^{n-j} (-1)^j</math><br />
<br />
<math>\sum_{i=0}^n {n \choose k} x^{n-i} (-1)^i \sum_{j=i}^n a_j </math></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5992User talk:PaoloMartini2006-09-14T19:36:22Z<p>PaoloMartini: </p>
<hr />
<div></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5991User talk:PaoloMartini2006-09-14T18:16:10Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-i} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n \left[ a_i \left( \sum_{k=0}^n {n \choose k} x^k (-1)^k \right) \right]<br />
= \sum_{i=0}^n \sum_{k=0}^i a_i {n \choose k} x^k (-1)^k<br />
= \sum_{i=0}^n \sum_{k=0}^i a_k {n \choose i} x^i (-1)^i.</math><br />
<br />
QED.<br />
<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5990User talk:PaoloMartini2006-09-14T18:14:57Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-i} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n \left[ a_i \left( \sum_{k=0}^n {n \choose k} x^k (-1)^k \right) \right]<br />
= \sum_{i=0}^n \sum_{k=0}^i (-1)^k a_i {n \choose k} x^k<br />
= \sum_{i=0}^n \sum_{k=0}^i a_k {n \choose i} x^i (-1)^i.</math><br />
<br />
QED.<br />
<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5989User talk:PaoloMartini2006-09-14T17:55:20Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-i} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n \left[ a_i \left( \sum_{k=0}^n {n \choose k} x^k (-1)^k \right) \right]<br />
= \sum_{i=0}^n \sum_{k=0}^i (-1)^k a_i {n \choose k} x^k.</math><br />
<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5988User talk:PaoloMartini2006-09-14T17:50:16Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-i} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n \left[ a_i \left( \sum_{k=0}^n {n \choose k} x^k (-1)^k \right) \right]<br />
= \sum_{i=0}^n \sum_{k=0}^i (-1)^k a_i {n \choose k} x^k<br />
= \sum_{i=0}^n \left( a_i x^i \sum_{k=0}^i (-1)^k {n \choose k} \right).</math><br />
<br />
QED.<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5987User talk:PaoloMartini2006-09-14T17:29:02Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-i} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n \left[ a_i \left( \sum_{k=0}^n {n \choose k} x^k (-1)^k \right) \right]<br />
= \sum_{i=0}^n \sum_{k=0}^i (-1)^k a_i {n \choose k} x^k</math><br />
<br />
zZzZ...<br />
<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5984User talk:PaoloMartini2006-09-14T15:52:59Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-i} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n \left[ a_i \left( \sum_{k=0}^n {n \choose k} x^k (-1)^k \right) \right] </math><br />
<br />
zZzZ...<br />
<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5982User talk:PaoloMartini2006-09-14T15:44:08Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-i} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n (a_i \sum_{k=0}^n {n \choose k} x^k (-1)^k). </math><br />
<br />
zZzZ...<br />
<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5981User talk:PaoloMartini2006-09-14T15:43:12Z<p>PaoloMartini: </p>
<hr />
<div>Show that if <math>p(x)</math> is a polynomial of degree <math>n</math>, then <math>p(x - 1)</math> is a polynomial of the same degree.<br />
<br />
Definition of polynomial.<br />
<br />
:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
Binomial theorem.<br />
<br />
:<math>(a + b)^n = \sum_{i=0}^n {n \choose i} a^{n-1} b^i </math><br />
<br />
Special case.<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^{n-i} (-1)^i </math><br />
<br />
Binomial coefficient simmetry.<br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
Hence:<br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n (a_i \sum_{k=0}^n {n \choose k} x^k (-1)^k). </math><br />
<br />
zZzZ...<br />
<br />
----</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User_talk:PaoloMartini&diff=5979User talk:PaoloMartini2006-09-14T15:30:50Z<p>PaoloMartini: </p>
<hr />
<div>:<math>p(x) = \sum_{i=0}^n a_i x^i </math><br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i } x^{n-i} (-1)^i </math><br />
<br />
:<math>{n \choose k} = {n \choose n-k} </math><br />
<br />
:<math>(x - 1)^n = \sum_{i=0}^n {n \choose i} x^i (-1)^i </math><br />
<br />
:<math>p(x-1) = \sum_{i=0}^n a_i (x - 1)^i<br />
= \sum_{i=0}^n (a_i \sum_{k=0}^n {n \choose k} x^k (-1)^k). </math></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=AngloHaskell/2007&diff=5114AngloHaskell/20072006-08-02T19:19:56Z<p>PaoloMartini: Let's have some fun :-)</p>
<hr />
<div>On June the 9th, Microsoft Research sent out an advert for a job. This job involves maintaining the Glorious Glasgow Compiler, and created quite a stir in the Haskell community: It's the job we've all been hoping for! After a while the CV's were sent, and Microsoft Research has now invited several Haskellers for an interview at Cambridge, UK.<br />
<br />
This event has been recognized as a great opportunity for a Haskell gathering and we hereby invite all Haskellers (and other cool people) to a fun couple of days in Cambridge.<br />
<br />
Date:<br />
* Friday the 4th and Saturday the 5th of August.<br />
<br />
Contact person:<br />
Shae Erisson - +46 70 3915045<br />
<br />
Local contact:<br />
Ganesh Sittampalam - 07968 253467 (+44 7968 253467 from a non-UK phone)<br />
<br />
If you're coming into Cambridge by train and want to join in the fun, call Shae at the number above.<br />
<br />
== Directions to MSR ==<br />
<br />
MSR has [http://research.microsoft.com/aboutmsr/visitmsr/cambridge/directions.aspx some directions], which can be best summarised as ‘get a taxi’. Here is (hopefully) a [http://earth.google.com/ Google Earth] [[Media:Microsoft_Research,_Cambridge.kmz|location]] of MSR, as well as a [http://maps.google.com/maps?q=CB3+0FB&ll=52.211499,0.117073&spn=0.02677,0.086517 Google Maps link]. (J J Thomson Avenue is immediately west of Clerk Maxwell Road.)<br />
<br />
If you do take a taxi and the driver doesn't know where it is, tell him or her to drive down Madingley Road until you reach the West Cambridge site, J J Thomson Avenue. The Computer Laboratory (next door) has [http://www.cl.cam.ac.uk/UoCCL/contacts/#gettinghere marginally better instructions].<br />
<br />
The fastest way to MSR (on foot and public transport) from the station is to [http://maps.google.com/maps?saddr=CB1+2JW&daddr=Trumpington+Road,+Cambridge cut through to Trumpington Road via Bateman Street] (don't follow the driving directions!), and take the Citi 4 or Uni 4. There's a bus stop just across the road from Bateman Street.<br />
<br />
To get to the city centre by bus, take the Citi 1 or Citi 3. Do ask to make sure they're going in the right direction though! There are also a number of clearly marked shuttle busses between the centre and station running during the day every 10 minutes or so.<br />
<br />
To walk to the centre (20 minutes not carrying luggage), go straight down the road facing you when you come out of the station, bear right when the road ends at some traffic lights / a WW1 memorial / the botanic gardens, and keep walking straight (Hills Road / Regent St / St Andrews St) for quite a while until you reach a pedestrianised bit, at which point you are in the centre.<br />
<br />
From the city centre to MSR, you can catch the number 77 Madingley Road Park and Ride which goes from bus stop M on Emma St. (Or find your way to Pembroke or Silver Street, and catch the Citi 4 / Uni 4 from there.)<br />
<br />
== Attendees ==<br />
<br />
All attendees, '''please bring or make a nametag''' that identifies you by your real name and/or IRC name.<br />
<br />
=== Definite ===<br />
<br />
* Simon Peyton-Jones and Simon Marlow (Friday only)<br />
* Lemmih (will arrive the 2nd and leave the 6th)<br />
* PhilippaCowderoy (barring emergencies, can hang around)<br />
* [http://www.scannedinavian.com/hope/ ShaeErisson] [B0EF20CC] (shapr) (will arrive the 2nd and leave the 5th)<br />
* Peter Nuttall (am around from the 26 July onwards, baring the 3rd when I'm in ipswitch)<br />
* genneth (am in Cambridge anyway)<br />
* GaneshSittampalam (Heffalump) (for at least some of the time)<br />
* Neil Mitchell - ndm (will arrive 4pm on the 5th)<br />
* Liyang HU<br />
* Robin Green (greenrd)<br />
* Dana N Xu<br />
* Duncan Coutts (dcoutts)<br />
* Edwin Brady (From about 2:30pm on Friday)<br />
* PaoloMartini (xerox)<br />
<br />
=== Possible ===<br />
<br />
* GK (depends on the date; it'd be great to meet some of the wonderful Haskell community folks)<br />
* vincenz (depends on the date, preferably a day or two, partially weekend)<br />
** Would need details in advance to reserve ticket for EUROSTAR<br />
* Paul Johnson (paj) (paul at cogito dot org dot uk)<br />
** Almost certain. Looking for crash space or pointer to nearby cheap hotel<br />
* eivuokko<br />
* Alexander Jacobson<br />
<br />
== Lodging ==<br />
<br />
* Are there places we can crash, rooms we can share?<br />
** Bring your own sleeping bag, if using one of the crash spaces below!<br />
** dcoutts has offered floor space to a few, however, there may not be any left.<br />
** psnl (Pete Nuttall) has 14 sq metres of floor crash space in a college.<br />
** Ganesh Sittampalam has several places worth of crash space left. Ask me on IRC (Heffalump)<br />
<br />
== Programme ==<br />
<br />
Planning is taking place on IRC: #anglohaskell on irc.freenode.net<br />
<br />
=== Friday Talks ===<br />
<br />
* Stop Press! We will have a projector ''and'' a whiteboard!<br />
* Lemmih could give a short talk on breakpoints in GHC<br />
* Liyang is prepared to wave his arms in the air while not making much sense about ''idiomatic programming'' (and '''not just''' the ''applicative idioms'' you've witnessed previously...) with an additional helping of ''memoisation''.<br />
* Paul Johnson will give a talk on '''discrete event simulation'''.<br />
* Ganesh Sittampalam might talk about recent '''Darcs''' work involving patch theory<br />
<br />
==== Formal verification and dependent types ====<br />
<br />
* Dana N Xu will talk about '''Extended Static Checking''' for Haskell (ESC/Haskell)<br />
* Edwin Brady might "introduce '''dependent types''' then talk about [his] pet '''[http://www.dcs.st-and.ac.uk/~eb/Ivor/ theorem prover]'''"<br />
* Robin Green is preparing a talk about simulating '''dependent types''' in Haskell, and using them for "categorical programming" (programming based on '''category theory''') and proving properties of code<br />
<br />
=== Rest of Friday ===<br />
<br />
* Is there anything other than talks for Friday while we're still at MSR? If not, are there enough talks to warrant a morning start?<br />
* Where's lunch?<br />
* We're expecting to hit a pub or two after MSR before we all find our crashspace?<br />
* No doubt there're possibilities while at a pub other than beer and chat?<br />
* There's been mention of Go?<br />
* And other games that take less time to learn to play?<br />
* Do we have enough people who think they know the rules to get the Chairman's Game going? Can we avoid it turning turing complete?<br />
<br />
=== Saturday Stuff ===<br />
<br />
* some kind of '''coding / pair programming'''? Maybe on Saturday when we're not going to be at MSR (we haven't figured out where we will be yet)<br />
* We don't know what we're doing on Saturday yet!<br />
* Perhaps colonise a '''café''' in the morning 'til everyone's reasonably awake, then head for a '''pub''' or similar with '''wi-fi''' (perhaps the connection is less important?) for coding and/or more social geeking as per everyone's taste?<br />
<br />
== Wireless internet ==<br />
<br />
MSR is willling to provide wireless internet to everyone who gives their name and email address.<br />
<br />
* David Himmelstrup, lemmih AT gmail.com<br />
* Ian Lynagh, igloo AT earth.li<br />
* Shae Erisson, shae AT ScannedInAvian.com<br />
* Edwin Brady, eb AT dcs.st-and.ac.uk<br />
* Liyang HU, msrc AT liyang.hu<br />
* Ganesh Sittampalam, ganesh AT earth.li<br />
* Duncan Coutts, duncan.coutts at comlab.ox.ac.uk<br />
<br />
[[Category:Events]]</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Roman_numerals&diff=5048Roman numerals2006-07-29T13:45:45Z<p>PaoloMartini: Roman numerals; oneliner and type encoding; first revision</p>
<hr />
<div>The system of '''Roman numerals''' is a numeral system originating in ancient Rome, and was adapted from Etruscan numerals. The system used in classical antiquity was slightly modified in the Middle Ages to produce the system we use today. It is based on certain letters which are given values as numerals.<br />
<br />
== Oneliner ==<br />
<br />
This is a nearly-completely points-freed expression which evaluates a given Roman numeral as a String to the corresponding Int. The folded function is not points-freed for ease of reading, and it would also need an `if' function which needs separate definition.<br />
<br />
<haskell><br />
import Data.Maybe (fromJust)<br />
<br />
romanToInt :: String -> Int<br />
romanToInt = fst . foldr (\p (t,s) -> if p >= s then (t+p,p) else (t-p,p)) (0,0) . map (fromJust . flip lookup (zip "IVXLCDM" [1,5,10,50,100,500,1000]))<br />
</haskell><br />
<br />
== Roman (type-)numerals ==<br />
<br />
The function `roman' here infers the value of the Roman numeral from the type of its first argument, which in turn is left unevaluated, and returns it as an Int.<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Romans where<br />
<br />
class Roman t where<br />
roman :: t -> Int<br />
<br />
data O -- 0<br />
data I a -- 1<br />
data V a -- 5<br />
data X a -- 10<br />
data L a -- 50<br />
data C a -- 100<br />
data D a -- 500<br />
data M a -- 1000<br />
<br />
instance Roman O where roman _ = 0<br />
instance Roman (I O) where roman _ = 1<br />
instance Roman (V O) where roman _ = 5<br />
instance Roman (X O) where roman _ = 10<br />
<br />
instance Roman (I a) => Roman (I (I a)) where roman _ = roman (undefined :: (I a)) + 1<br />
instance Roman a => Roman (I (V a)) where roman _ = roman (undefined :: a) + 4<br />
instance Roman a => Roman (I (X a)) where roman _ = roman (undefined :: a) + 9<br />
<br />
instance Roman (I a) => Roman (V (I a)) where roman _ = roman (undefined :: (I a)) + 5<br />
instance Roman (V a) => Roman (V (V a)) where roman _ = roman (undefined :: (V a)) + 5<br />
<br />
instance Roman (I a) => Roman (X (I a)) where roman _ = roman (undefined :: (I a)) + 10<br />
instance Roman (V a) => Roman (X (V a)) where roman _ = roman (undefined :: (V a)) + 10<br />
instance Roman (X a) => Roman (X (X a)) where roman _ = roman (undefined :: (X a)) + 10<br />
instance Roman a => Roman (X (L a)) where roman _ = roman (undefined :: a) + 40<br />
instance Roman a => Roman (X (C a)) where roman _ = roman (undefined :: a) + 90<br />
instance Roman a => Roman (X (D a)) where roman _ = roman (undefined :: a) + 490<br />
<br />
instance Roman a => Roman (L a) where roman _ = roman (undefined :: a) + 50<br />
<br />
instance Roman (I a) => Roman (C (I a)) where roman _ = roman (undefined :: (I a)) + 100<br />
instance Roman (V a) => Roman (C (V a)) where roman _ = roman (undefined :: (V a)) + 100<br />
instance Roman (X a) => Roman (C (X a)) where roman _ = roman (undefined :: (X a)) + 100<br />
instance Roman (L a) => Roman (C (L a)) where roman _ = roman (undefined :: (L a)) + 100<br />
instance Roman (C a) => Roman (C (C a)) where roman _ = roman (undefined :: (C a)) + 100<br />
instance Roman a => Roman (C (D a)) where roman _ = roman (undefined :: a) + 400<br />
instance Roman a => Roman (C (M a)) where roman _ = roman (undefined :: a) + 900<br />
<br />
instance Roman a => Roman (D a) where roman _ = roman (undefined :: a) + 500<br />
<br />
instance Roman a => Roman (M a) where roman _ = roman (undefined :: a) + 1000<br />
<br />
-- Example type: XVI ~> X (V (I O)); MCMXCIX ~> M (C (M (X (C (I (X O))))))<br />
<br />
powersoftwo = [roman (undefined :: (I (I O))),<br />
roman (undefined :: (I (V O))),<br />
roman (undefined :: (V (I (I (I O))))),<br />
roman (undefined :: (X (V (I O)))),<br />
roman (undefined :: (X (X (X (I (I O)))))),<br />
roman (undefined :: (L (X (I (V O))))),<br />
roman (undefined :: (C (X (X (V (I (I (I O)))))))),<br />
roman (undefined :: (C (C (L (V (I O)))))),<br />
roman (undefined :: (D (X (I (I O))))),<br />
roman (undefined :: (M (X (X (I (V O)))))),<br />
roman (undefined :: (M (M (X (L (V (I (I (I O)))))))))]<br />
</haskell><br />
<br />
[[Category:Idioms]]</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=5036User:PaoloMartini2006-07-29T00:54:30Z<p>PaoloMartini: Cleaned up Romans (no more unuseful argument and function composition)</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell><br />
<br />
== Catamorfism on a binary tree ==<br />
<br />
Replacing systematically the data constructors with an evaluation function.<br />
<br />
<haskell><br />
data Tree a = Leaf a<br />
| Branch (Tree a) (Tree a)<br />
<br />
cata :: (a -> r, r -> r -> r) -> Tree a -> r<br />
cata (f1,f2) (Leaf x) = f1 x<br />
cata (f1,f2) (Branch b1 b2) = f2 (cata (f1,f2) b1) (cata (f1,f2) b2)<br />
</haskell><br />
<br />
<br />
== Fibonacci (type-)numbers ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module Fibonacci where<br />
<br />
data Zero<br />
data Succ n<br />
type One = Succ Zero<br />
<br />
class Add a b c | a b -> c where<br />
add :: a -> b -> c<br />
<br />
instance Add Zero n n<br />
instance Add a b c => Add (Succ a) b (Succ c)<br />
<br />
class Fib n m | n -> m where<br />
fib :: n -> m<br />
<br />
instance Fib Zero Zero<br />
instance Fib One One<br />
instance (Fib n a, Fib (Succ n) b, Add a b c) => Fib (Succ (Succ n)) c<br />
</haskell><br />
<br />
== Points-free hylomorphism ==<br />
<br />
<haskell><br />
module Refold where<br />
<br />
fold f n [ ] = n<br />
fold f n (x:xs) = f x (fold f n xs)<br />
<br />
unfold p f g x = if p x then [] else f x : unfold p f g (g x)<br />
<br />
{-<br />
refold c n p f g = fold c n . unfold p f g<br />
refold c n p f = (fold c n .) . unfold p f<br />
refold c n p = ((fold c n .) .) . unfold p<br />
refold c n = (((fold c n .) .) .) . unfold<br />
refold c n = (\x -> (((x .) .) .) . unfold) fold c n<br />
refold c = (\x -> (((x .) .) .) . unfold) . fold c<br />
refold = ((\x -> (((x .) .) .) . unfold) .) . fold<br />
refold = ((\x -> (.) (((x .) .) .) unfold) .) . fold<br />
refold = ((\x -> flip (.) unfold (((x .) .) .)) .) . fold<br />
refold = ((\x -> flip (.) unfold . (\x -> (.) ((.) ((.) x))) $ x) .) . fold<br />
refold = ((flip (.) unfold . ((.) . (.) . (.))) .) . fold<br />
-}<br />
<br />
refold = ((flip (.) unfold . (.) . (.) . (.)) .) . fold<br />
</haskell><br />
<br />
== Roman (type-)numerals ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Romans where<br />
<br />
class Roman t where<br />
roman :: t -> Int<br />
<br />
data O -- 0<br />
data I a -- 1<br />
data V a -- 5<br />
data X a -- 10<br />
data L a -- 50<br />
data C a -- 100<br />
data D a -- 500<br />
data M a -- 1000<br />
<br />
instance Roman O where roman _ = 0<br />
instance Roman (I O) where roman _ = 1<br />
instance Roman (V O) where roman _ = 5<br />
instance Roman (X O) where roman _ = 10<br />
<br />
instance Roman (I a) => Roman (I (I a)) where roman _ = roman (undefined :: (I a)) + 1<br />
instance Roman a => Roman (I (V a)) where roman _ = roman (undefined :: a) + 4<br />
instance Roman a => Roman (I (X a)) where roman _ = roman (undefined :: a) + 9<br />
<br />
instance Roman (I a) => Roman (V (I a)) where roman _ = roman (undefined :: (I a)) + 5<br />
instance Roman (V a) => Roman (V (V a)) where roman _ = roman (undefined :: (V a)) + 5<br />
<br />
instance Roman (I a) => Roman (X (I a)) where roman _ = roman (undefined :: (I a)) + 10<br />
instance Roman (V a) => Roman (X (V a)) where roman _ = roman (undefined :: (V a)) + 10<br />
instance Roman (X a) => Roman (X (X a)) where roman _ = roman (undefined :: (X a)) + 10<br />
instance Roman a => Roman (X (L a)) where roman _ = roman (undefined :: a) + 40<br />
instance Roman a => Roman (X (C a)) where roman _ = roman (undefined :: a) + 90<br />
instance Roman a => Roman (X (D a)) where roman _ = roman (undefined :: a) + 490<br />
<br />
instance Roman a => Roman (L a) where roman _ = roman (undefined :: a) + 50<br />
<br />
instance Roman (I a) => Roman (C (I a)) where roman _ = roman (undefined :: (I a)) + 100<br />
instance Roman (V a) => Roman (C (V a)) where roman _ = roman (undefined :: (V a)) + 100<br />
instance Roman (X a) => Roman (C (X a)) where roman _ = roman (undefined :: (X a)) + 100<br />
instance Roman (L a) => Roman (C (L a)) where roman _ = roman (undefined :: (L a)) + 100<br />
instance Roman (C a) => Roman (C (C a)) where roman _ = roman (undefined :: (C a)) + 100<br />
instance Roman a => Roman (C (D a)) where roman _ = roman (undefined :: a) + 400<br />
instance Roman a => Roman (C (M a)) where roman _ = roman (undefined :: a) + 900<br />
<br />
instance Roman a => Roman (D a) where roman _ = roman (undefined :: a) + 500<br />
<br />
instance Roman a => Roman (M a) where roman _ = roman (undefined :: a) + 1000<br />
<br />
powersoftwo = [roman (undefined :: (I (I O))),<br />
roman (undefined :: (I (V O))),<br />
roman (undefined :: (V (I (I (I O))))),<br />
roman (undefined :: (X (V (I O)))),<br />
roman (undefined :: (X (X (X (I (I O)))))),<br />
roman (undefined :: (L (X (I (V O))))),<br />
roman (undefined :: (C (X (X (V (I (I (I O)))))))),<br />
roman (undefined :: (C (C (L (V (I O)))))),<br />
roman (undefined :: (D (X (I (I O))))),<br />
roman (undefined :: (M (X (X (I (V O)))))),<br />
roman (undefined :: (M (M (X (L (V (I (I (I O)))))))))]<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=5035User:PaoloMartini2006-07-29T00:18:37Z<p>PaoloMartini: Roman numerals</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell><br />
<br />
== Catamorfism on a binary tree ==<br />
<br />
Replacing systematically the data constructors with an evaluation function.<br />
<br />
<haskell><br />
data Tree a = Leaf a<br />
| Branch (Tree a) (Tree a)<br />
<br />
cata :: (a -> r, r -> r -> r) -> Tree a -> r<br />
cata (f1,f2) (Leaf x) = f1 x<br />
cata (f1,f2) (Branch b1 b2) = f2 (cata (f1,f2) b1) (cata (f1,f2) b2)<br />
</haskell><br />
<br />
<br />
== Fibonacci (type-)numbers ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module Fibonacci where<br />
<br />
data Zero<br />
data Succ n<br />
type One = Succ Zero<br />
<br />
class Add a b c | a b -> c where<br />
add :: a -> b -> c<br />
<br />
instance Add Zero n n<br />
instance Add a b c => Add (Succ a) b (Succ c)<br />
<br />
class Fib n m | n -> m where<br />
fib :: n -> m<br />
<br />
instance Fib Zero Zero<br />
instance Fib One One<br />
instance (Fib n a, Fib (Succ n) b, Add a b c) => Fib (Succ (Succ n)) c<br />
</haskell><br />
<br />
== Points-free hylomorphism ==<br />
<br />
<haskell><br />
module Refold where<br />
<br />
fold f n [ ] = n<br />
fold f n (x:xs) = f x (fold f n xs)<br />
<br />
unfold p f g x = if p x then [] else f x : unfold p f g (g x)<br />
<br />
{-<br />
refold c n p f g = fold c n . unfold p f g<br />
refold c n p f = (fold c n .) . unfold p f<br />
refold c n p = ((fold c n .) .) . unfold p<br />
refold c n = (((fold c n .) .) .) . unfold<br />
refold c n = (\x -> (((x .) .) .) . unfold) fold c n<br />
refold c = (\x -> (((x .) .) .) . unfold) . fold c<br />
refold = ((\x -> (((x .) .) .) . unfold) .) . fold<br />
refold = ((\x -> (.) (((x .) .) .) unfold) .) . fold<br />
refold = ((\x -> flip (.) unfold (((x .) .) .)) .) . fold<br />
refold = ((\x -> flip (.) unfold . (\x -> (.) ((.) ((.) x))) $ x) .) . fold<br />
refold = ((flip (.) unfold . ((.) . (.) . (.))) .) . fold<br />
-}<br />
<br />
refold = ((flip (.) unfold . (.) . (.) . (.)) .) . fold<br />
</haskell><br />
<br />
== Roman (type-)numerals ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Romans where<br />
<br />
class Roman t where<br />
roman :: t -> Int -> Int<br />
<br />
data O -- 0<br />
data I a -- 1<br />
data V a -- 5<br />
data X a -- 10<br />
data L a -- 50<br />
data C a -- 100<br />
data D a -- 500<br />
data M a -- 1000<br />
<br />
instance Roman O where roman _ = (+0)<br />
instance Roman (I O) where roman _ = (+1)<br />
instance Roman (V O) where roman _ = (+5)<br />
instance Roman (X O) where roman _ = (+10)<br />
<br />
instance Roman (I a) => Roman (I (I a)) where roman _ = roman (undefined :: (I a)) . (+1)<br />
instance Roman (V a) => Roman (I (V a)) where roman _ = roman (undefined :: (V a)) . subtract 1<br />
instance Roman a => Roman (I (X a)) where roman _ = roman (undefined :: a) . (+9)<br />
<br />
instance Roman (I a) => Roman (V (I a)) where roman _ = roman (undefined :: (I a)) . (+5)<br />
instance Roman (V a) => Roman (V (V a)) where roman _ = roman (undefined :: (V a)) . (+5)<br />
<br />
instance Roman (I a) => Roman (X (I a)) where roman _ = roman (undefined :: (I a)) . (+10)<br />
instance Roman (V a) => Roman (X (V a)) where roman _ = roman (undefined :: (V a)) . (+10)<br />
instance Roman (X a) => Roman (X (X a)) where roman _ = roman (undefined :: (X a)) . (+10)<br />
instance Roman a => Roman (X (L a)) where roman _ = roman (undefined :: a) . (+40)<br />
instance Roman a => Roman (X (C a)) where roman _ = roman (undefined :: a) . (+90)<br />
instance Roman a => Roman (X (D a)) where roman _ = roman (undefined :: a) . (+490)<br />
<br />
instance Roman a => Roman (L a) where roman _ = roman (undefined :: a) . (+50)<br />
<br />
instance Roman (I a) => Roman (C (I a)) where roman _ = roman (undefined :: (I a)) . (+100)<br />
instance Roman (V a) => Roman (C (V a)) where roman _ = roman (undefined :: (V a)) . (+100)<br />
instance Roman (X a) => Roman (C (X a)) where roman _ = roman (undefined :: (X a)) . (+100)<br />
instance Roman (L a) => Roman (C (L a)) where roman _ = roman (undefined :: (L a)) . (+100)<br />
instance Roman (C a) => Roman (C (C a)) where roman _ = roman (undefined :: (C a)) . (+100)<br />
instance Roman a => Roman (C (D a)) where roman _ = roman (undefined :: a) . (+400)<br />
instance Roman a => Roman (C (M a)) where roman _ = roman (undefined :: a) . (+900)<br />
<br />
instance Roman a => Roman (D a) where roman _ = roman (undefined :: a) . (+500)<br />
<br />
instance Roman a => Roman (M a) where roman _ = roman (undefined :: a) . (+1000)<br />
<br />
powersoftwo = [roman (undefined :: (I (I O))) 0,<br />
roman (undefined :: (I (V O))) 0,<br />
roman (undefined :: (V (I (I (I O))))) 0,<br />
roman (undefined :: (X (V (I O)))) 0,<br />
roman (undefined :: (X (X (X (I (I O)))))) 0,<br />
roman (undefined :: (L (X (I (V O))))) 0,<br />
roman (undefined :: (C (X (X (V (I (I (I O)))))))) 0,<br />
roman (undefined :: (C (C (L (V (I O)))))) 0,<br />
roman (undefined :: (D (X (I (I O))))) 0,<br />
roman (undefined :: (M (X (X (I (V O)))))) 0,<br />
roman (undefined :: (M (M (X (L (V (I (I (I O))))))))) 0]<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4927User:PaoloMartini2006-07-19T13:10:03Z<p>PaoloMartini: Points-free hylomorphism</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell><br />
<br />
== Catamorfism on a binary tree ==<br />
<br />
Replacing systematically the data constructors with an evaluation function.<br />
<br />
<haskell><br />
data Tree a = Leaf a<br />
| Branch (Tree a) (Tree a)<br />
<br />
cata :: (a -> r, r -> r -> r) -> Tree a -> r<br />
cata (f1,f2) (Leaf x) = f1 x<br />
cata (f1,f2) (Branch b1 b2) = f2 (cata (f1,f2) b1) (cata (f1,f2) b2)<br />
</haskell><br />
<br />
<br />
== Fibonacci (type-)numbers ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module Fibonacci where<br />
<br />
data Zero<br />
data Succ n<br />
type One = Succ Zero<br />
<br />
class Add a b c | a b -> c where<br />
add :: a -> b -> c<br />
<br />
instance Add Zero n n<br />
instance Add a b c => Add (Succ a) b (Succ c)<br />
<br />
class Fib n m | n -> m where<br />
fib :: n -> m<br />
<br />
instance Fib Zero Zero<br />
instance Fib One One<br />
instance (Fib n a, Fib (Succ n) b, Add a b c) => Fib (Succ (Succ n)) c<br />
</haskell><br />
<br />
== Points-free hylomorphism ==<br />
<br />
<haskell><br />
module Refold where<br />
<br />
fold f n [ ] = n<br />
fold f n (x:xs) = f x (fold f n xs)<br />
<br />
unfold p f g x = if p x then [] else f x : unfold p f g (g x)<br />
<br />
{-<br />
refold c n p f g = fold c n . unfold p f g<br />
refold c n p f = (fold c n .) . unfold p f<br />
refold c n p = ((fold c n .) .) . unfold p<br />
refold c n = (((fold c n .) .) .) . unfold<br />
refold c n = (\x -> (((x .) .) .) . unfold) fold c n<br />
refold c = (\x -> (((x .) .) .) . unfold) . fold c<br />
refold = ((\x -> (((x .) .) .) . unfold) .) . fold<br />
refold = ((\x -> (.) (((x .) .) .) unfold) .) . fold<br />
refold = ((\x -> flip (.) unfold (((x .) .) .)) .) . fold<br />
refold = ((\x -> flip (.) unfold . (\x -> (.) ((.) ((.) x))) $ x) .) . fold<br />
refold = ((flip (.) unfold . ((.) . (.) . (.))) .) . fold<br />
-}<br />
<br />
refold = ((flip (.) unfold . (.) . (.) . (.)) .) . fold<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4919User:PaoloMartini2006-07-18T19:43:14Z<p>PaoloMartini: Fibonacci (type-)numbers</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell><br />
<br />
== Catamorfism on a binary tree ==<br />
<br />
Replacing systematically the data constructors with an evaluation function.<br />
<br />
<haskell><br />
data Tree a = Leaf a<br />
| Branch (Tree a) (Tree a)<br />
<br />
cata :: (a -> r, r -> r -> r) -> Tree a -> r<br />
cata (f1,f2) (Leaf x) = f1 x<br />
cata (f1,f2) (Branch b1 b2) = f2 (cata (f1,f2) b1) (cata (f1,f2) b2)<br />
</haskell><br />
<br />
<br />
== Fibonacci (type-)numbers ==<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module Fibonacci where<br />
<br />
data Zero<br />
data Succ n<br />
type One = Succ Zero<br />
<br />
class Add a b c | a b -> c where<br />
add :: a -> b -> c<br />
<br />
instance Add Zero n n<br />
instance Add a b c => Add (Succ a) b (Succ c)<br />
<br />
class Fib n m | n -> m where<br />
fib :: n -> m<br />
<br />
instance Fib Zero Zero<br />
instance Fib One One<br />
instance (Fib n a, Fib (Succ n) b, Add a b c) => Fib (Succ (Succ n)) c<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4908User:PaoloMartini2006-07-18T10:09:34Z<p>PaoloMartini: </p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell><br />
<br />
== Catamorfism on a binary tree ==<br />
<br />
Replacing systematically the data constructors with an evaluation function.<br />
<br />
<haskell><br />
data Tree a = Leaf a<br />
| Branch (Tree a) (Tree a)<br />
<br />
cata :: (a -> r, r -> r -> r) -> Tree a -> r<br />
cata (f1,f2) (Leaf x) = f1 x<br />
cata (f1,f2) (Branch b1 b2) = f2 (cata (f1,f2) b1) (cata (f1,f2) b2)<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4861User:PaoloMartini2006-07-17T11:08:21Z<p>PaoloMartini: Points-freed Pascal's triangle</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
=== Manual reductions ===<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
<haskell><br />
pascal = iterate (ap (zipWith (+) . (++ [1])) ([1] ++)) [1]<br />
-- > take 3 pascal<br />
-- [[1],[2,2],[3,4,3]]<br />
</haskell><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4855User:PaoloMartini2006-07-17T10:34:00Z<p>PaoloMartini: (W a) and TOC</p>
<hr />
<div>{{TOC}}<br />
<br />
== Points-free contest ==<br />
<br />
<pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
== Experimenting with variadic functions ==<br />
<br />
=== First revision (W (a -> a)) ===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell><br />
<br />
=== No more incoherent instances ((W a) and QuickCheck)===<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts #-}<br />
module Apply<br />
where<br />
<br />
import Test.QuickCheck<br />
<br />
data W a = W { reify :: a } deriving Show -- wrapper<br />
<br />
class Apply a r | r -> a where<br />
apply :: (a -> a -> a) -> a -> a -> r<br />
<br />
instance Apply a (W a) where<br />
apply f x y = W (f x y)<br />
<br />
instance Apply a r => Apply a (a -> r) where<br />
apply f x y z = apply f (f x y) z<br />
<br />
-- test<br />
<br />
plus_prop = quickCheck p2 >> quickCheck p3 >> quickCheck p4<br />
<br />
where p2 :: Int -> Int -> Bool<br />
p3 :: Int -> Int -> Int -> Bool<br />
p4 :: Int -> Int -> Int -> Int -> Bool<br />
<br />
p2 x y = (reify $ apply (+) x y) == x + y<br />
p3 x y z = (reify $ apply (+) x y z) == x + y + z<br />
p4 x y z w = (reify $ apply (+) x y z w) == x + y + z + w<br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4848User:PaoloMartini2006-07-17T08:28:14Z<p>PaoloMartini: Fixed test2</p>
<hr />
<div><pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
Experimenting with variadic functions.<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test1<br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4825User:PaoloMartini2006-07-17T01:28:17Z<p>PaoloMartini: </p>
<hr />
<div><pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre><br />
<br />
Experimenting with variadic functions.<br />
<br />
<haskell><br />
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}<br />
module VarArg<br />
where<br />
<br />
data W a = W { unW :: a } deriving Show<br />
<br />
-- `c' is:<br />
--<br />
-- c f x = (f x)<br />
-- c f x y = c (f x) y<br />
--<br />
<br />
class C a r | r -> a where<br />
c :: (a -> a -> a) -> a -> r<br />
<br />
instance C a (W (a -> a)) where<br />
c f x = W (\y -> f x y)<br />
<br />
r :: Int -> W (Int -> Int) -> Int<br />
r x = ($ x) . unW<br />
<br />
instance C a r => C a (a -> r) where<br />
c f x y = c f (f x y) <br />
<br />
test1 = let t1 = c (+) 1 <br />
t2 = c (+) 1 2 <br />
t3 = c (+) 1 2 3 <br />
t4 = c (+) 1 2 3 4 <br />
in map (r 0) [t1,t2,t3,t4]<br />
<br />
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test2 <br />
<br />
-- `d' is:<br />
--<br />
-- d f [ ] = f<br />
-- d f (x:xs) = d (f x) xs<br />
--<br />
-- ..for which `c' is the only valid `f'.<br />
--<br />
<br />
class D a r | r -> a where<br />
d :: (forall r. (C a r) => a -> r) -> [a] -> r<br />
<br />
instance C a (W (a -> a)) => D a (W (a -> a)) where<br />
d f (x:[]) = f x<br />
d f (x:xs) = d (f x) xs<br />
<br />
test3 = let t1 = d (c (^)) [2..3]<br />
t2 = d (c (*)) [2..10]<br />
t3 = d (c (+)) [2..100]<br />
in map (r 1) [t1,t2,t3]<br />
<br />
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 <br />
</haskell></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4817User:PaoloMartini2006-07-16T13:21:30Z<p>PaoloMartini: f . g . h = ((f .) . (. h)) g</p>
<hr />
<div><pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre><br />
<br />
<pre><br />
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g<br />
</pre></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=User:PaoloMartini&diff=4739User:PaoloMartini2006-07-14T13:19:26Z<p>PaoloMartini: First revision ;-)</p>
<hr />
<div><pre><br />
\a b c -> a + (b*c)<br />
\a b c -> (+) a ((*) b c)<br />
\a b -> ((+) a) . ((*) b)<br />
\a -> (((+) a) .) . (*)<br />
\a -> (.) ((+ a) .) (*)<br />
\a -> (flip (.)) (*) ((+ a) .)<br />
\a -> (flip (.)) (*) (((.) (+ a))<br />
(flip (.)) (*) . ((.) . (+))<br />
<br />
<xerox> I think I deserve an award for that reduction.<br />
<dons> xerox reaches PointFree Hacker, Level 7.<br />
</pre></div>PaoloMartinihttps://wiki.haskell.org/index.php?title=AngloHaskell/2007&diff=4716AngloHaskell/20072006-07-13T14:24:29Z<p>PaoloMartini: </p>
<hr />
<div>On June the 9th, Microsoft Research sent out an advert for job. This job involves maintaining the Glorious Glasgow Compiler, and created quite a stir in the Haskell community: It's the job we've all been hoping for! After a while the CV's were sent, and Microsoft Research has now invited several Haskellers for an interview at Cambridge, UK.<br />
<br />
This event has been recognized as a great opportunity for a Haskell gathering and we hereby invite all Haskellers (and other cool people) to a fun couple of days in Cambridge.<br />
<br />
<br />
Definite attendees:<br />
* Lemmih (anytime between 31st of July to 11th of August, can stay for a couple of days)<br />
* PhilippaCowderoy (barring emergencies, can hang around)<br />
<br />
Possible attendees:<br />
* ndm (anytime except for: 4th and 6th-11th of August, can stay forever, apart from those times)<br />
* dcoutts (depends on the date)<br />
* xerox (depends on the date)<br />
<br />
Lodging:<br />
* Are there places we can crash, rooms we can share?<br />
* If dcoutts goes then he can probably offer floor space to a few.<br />
<br />
Facilities:<br />
* MSR might provide some space for AngloHaskellers to hang out during the day, w/ wireless network access.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3885Summer of Code/People2006-04-26T18:49:43Z<p>PaoloMartini: Moved on trac.</p>
<hr />
<div>Please refer to the new trac-based site at: <http://hackage.haskell.org/trac/summer-of-code/wiki/People>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3881Summer of Code/Project suggestions2006-04-26T01:46:32Z<p>PaoloMartini: Things moved to trac.</p>
<hr />
<div>Please refer to the new trac-based site at <http://hackage.haskell.org/trac/summer-of-code/>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3880Summer of Code/Project suggestions2006-04-26T00:08:17Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for [[Summer of Code: People | mentors]] to add their ideas and to say which projects they'd be happy to supervise. It's also ok for other people to add their own ideas that are not yet claimed by a mentor. If you do this, could you please notify an admin person so that they can try and find a mentor for that project idea, because in the end we can only deal with project ideas that do have people prepared to mentor them. <br />
<br />
Students should not claim projects here, they must use the normal Google Summer of Code application process. See the [http://code.google.com/soc/studentfaq.html student FAQ] for details.<br />
<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improve it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
==== Port the Clean high performance string code ====<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Storable a => Vector a ====<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Unicode layer over Data.ByteString ====<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unofficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
It would be cool to see a library using ideas from [http://www.sandr.dds.nl/FunctionalForms/index.html FunctionalForms] in Gtk2Hs.<br />
<br />
=== Darcs GUI ===<br />
<br />
Design and implement a GUI front-end using wxhaskell for Darcs.<br />
<br />
Mentor: No-one.<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in [http://www.lua.org/ lua], but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi, ekarttun@cs.helsinki.fi)<br />
<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editor's internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
== Bindings ==<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== Matlab Binding ===<br />
<br />
Matlab/Octave is an excellent tool for quick imperative numerical programming.<br />
However, it would be much nicer if anyone wrote bindings such<br />
that it could be mixed with Haskell.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
=== GSL Binding ===<br />
<br />
Extend the [http://dis.um.es/~alberto/GSLHaskell GSLHaskell] library to cover all the [http://www.gnu.org/software/gsl/ GSL] functions. Implement (possibly using additional numerical libraries) important Octave functions not available in the GSL.<br />
<br />
Mentor: Alberto Ruiz (aruiz@um.es)<br />
<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen (musasabi, ekarttun@cs.helsinki.fi)<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== IPv6 and IPSec for House ===<br />
<br />
Implement IPv6 and maybe IPSec for the House (an operating system in Haskell). Needs mostly networking knowledge and ideas for binary data serialization.<br />
<br />
=== Distributed compilation ===<br />
<br />
A distcc-like tool for Distributed compilation of Haskell code<br />
<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations. (See [http://www.cse.unsw.edu.au/~dons/h4sh.html h4sh].)<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Databases ==<br />
<br />
=== [[Libraries and tools/Database interfaces/HaskellDB|HaskellDB]] ===<br />
<br />
==== Port HaskellDB to HList ====<br />
<br />
[[Libraries and tools/Database interfaces/HaskellDB|HaskellDB]] currently uses its own [[Extensible record|record system]], which (I believe) is less powerful than [http://homepages.cwi.nl/~ralf/HList/ HList]. The project is to port HaskellDB to use HList instead, making any necessary changes to the interface to make this possible and to fit HList better.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Implement back-end dependent SQL generation in HaskellDB ====<br />
<br />
Currently HaskellDB uses the same SQL generator for all database systems. Unfortunately different database systems support different SQL dialects. The project is to make it possible to use different SQL generators for different back-ends, and implement generators for common database systems such as for example MySQL, PostgreSQL and SQLite. The project could also include adding support for back-end specific SQL extensions (such as various string and date functions, non-standard field types etc.) to the HaskellDB query language.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Add support for optimization features in HaskellDB ====<br />
<br />
The projects is to added support for indexes, prepared statements and other optimization features to HaskellDB.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
<br />
== Tools ==<br />
<br />
=== HaRe in GHC ===<br />
<br />
The Haskell Refactorer, [http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html HaRe], is a tool for refactoring Haskell<br />
systems. HaRe handles multi-module systems, and respects layout and<br />
comments, so that refactored code looks as much as possible like the<br />
original. HaRe covers the whole of Haskell 98, and uses the [http://www.cse.ogi.edu/PacSoft/projects/programatica/ Programatica]<br />
system for its front end functionality.<br />
<br />
Unfortunately, HaRe does not cover the whole of GHC Haskell. The aim of<br />
this project is to port HaRe to the GHC API, so that HaRe can extend its<br />
user base (and indeed be used to refactor itself!). This project builds on<br />
a [http://www.cs.kent.ac.uk/pubs/2005/2266/content.pdf feasibility study by Chris Ryder], which covers much of the tricky<br />
preliminary investigative work.<br />
<br />
Mentor: Simon Thompson (s.j.thompson@kent.ac.uk)<br />
<br />
=== Refactoring to Classes ===<br />
<br />
Haskell has a powerful overloading mechanism with interfaces provided by<br />
type classes and bindings to those interfaces by instance declarations.<br />
It is natural during program development first to define a system without<br />
overloading, and then to identify ways in which it can be introduced. This<br />
might be by identifying a single set of functions to form the basis of a<br />
class, or by identifying two such sets, which are to share the same<br />
collection of names.<br />
<br />
The aim of the project is to identify the use cases which would be most<br />
helpful to users, and then to implement them in the Haskell Refactorer,<br />
[http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html HaRe],. A particularly fertile application area is in transformation<br />
of non-monadic code into a monadic version.<br />
<br />
Mentor: Simon Thompson (s.j.thompson@kent.ac.uk)<br />
<br />
=== UML for Haskell ===<br />
<br />
There has been some discussion on how to mix UML (or object oriented coding<br />
in general). Try to develop a tool that creates haskell out of UML<br />
in a suitable way. This project requires a lot of creativity on the part<br />
of the student. A toy project to test the implementation should be implemented<br />
as well.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
=== A diagram editor ===<br />
<br />
GNU Dia is a quite badly maintained program, and progress has been slow.<br />
Show them how it should be done by implementing a modularized diagram editor in<br />
haskell. Experience of using these programs is a merit, since a key point<br />
is to squash all the current usability problems in Dia.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
<br />
== Formal Verification ==<br />
<br />
=== QuickCheck++ ===<br />
Take a hard theorem prover and connect it to Haskell by making it<br />
a drop-in replacement for QuickCheck<br />
<br />
Mentor: No-one</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3877Summer of Code/Project suggestions2006-04-25T22:01:26Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for [[Summer of Code: People | mentors]] to add their ideas and to say which projects they'd be happy to supervise. It's also ok for other people to add their own ideas that are not yet claimed by a mentor. If you do this, could you please notify an admin person so that they can try and find a mentor for that project idea, because in the end we can only deal with project ideas that do have people prepared to mentor them. <br />
<br />
Students should not claim projects here, they must use the normal Google Summer of Code application process. See the [http://code.google.com/soc/studentfaq.html student FAQ] for details.<br />
<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
==== Port the Clean high performance string code ====<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Storable a => Vector a ====<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Unicode layer over Data.ByteString ====<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Port Alex to Data.ByteString ====<br />
<br />
Port the [[Alex]] lexer generator to run with mmap'd Data.ByteStrings<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improve it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unofficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
It would be cool to see a library using ideas from [http://www.sandr.dds.nl/FunctionalForms/index.html FunctionalForms] in Gtk2Hs.<br />
<br />
=== Darcs GUI ===<br />
<br />
Design and implement a GUI front-end using wxhaskell for Darcs.<br />
<br />
Mentor: No-one.<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in [http://www.lua.org/ lua], but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi, ekarttun@cs.helsinki.fi)<br />
<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editor's internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
<br />
== Bindings ==<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== Matlab Binding ===<br />
<br />
Matlab/Octave is an excellent tool for quick imperative numerical programming.<br />
However, it would be much nicer if anyone wrote bindings such<br />
that it could be mixed with Haskell.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
=== GSL Binding ===<br />
<br />
Extend the [http://dis.um.es/~alberto/GSLHaskell GSLHaskell] library to cover all the [http://www.gnu.org/software/gsl/ GSL] functions. Implement (possibly using additional numerical libraries) important Octave functions not available in the GSL.<br />
<br />
Mentor: Alberto Ruiz (aruiz@um.es)<br />
<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen (musasabi, ekarttun@cs.helsinki.fi)<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== IPv6 and IPSec for House ===<br />
<br />
Implement IPv6 and maybe IPSec for the House (an operating system in Haskell). Needs mostly networking knowledge and ideas for binary data serialization.<br />
<br />
=== Distributed compilation ===<br />
<br />
A distcc-like tool for Distributed compilation of Haskell code<br />
<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations. (See [http://www.cse.unsw.edu.au/~dons/h4sh.html h4sh].)<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Databases ==<br />
<br />
=== [[Libraries and tools/Database interfaces/HaskellDB|HaskellDB]] ===<br />
<br />
==== Port HaskellDB to HList ====<br />
<br />
[[Libraries and tools/Database interfaces/HaskellDB|HaskellDB]] currently uses its own [[Extensible record|record system]], which (I believe) is less powerful than [http://homepages.cwi.nl/~ralf/HList/ HList]. The project is to port HaskellDB to use HList instead, making any necessary changes to the interface to make this possible and to fit HList better.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Implement back-end dependent SQL generation in HaskellDB ====<br />
<br />
Currently HaskellDB uses the same SQL generator for all database systems. Unfortunately different database systems support different SQL dialects. The project is to make it possible to use different SQL generators for different back-ends, and implement generators for common database systems such as for example MySQL, PostgreSQL and SQLite. The project could also include adding support for back-end specific SQL extensions (such as various string and date functions, non-standard field types etc.) to the HaskellDB query language.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Add support for optimization features in HaskellDB ====<br />
<br />
The projects is to added support for indexes, prepared statements and other optimization features to HaskellDB.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
<br />
== Tools ==<br />
<br />
=== HaRe in GHC ===<br />
<br />
The Haskell Refactorer, [http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html HaRe], is a tool for refactoring Haskell<br />
systems. HaRe handles multi-module systems, and respects layout and<br />
comments, so that refactored code looks as much as possible like the<br />
original. HaRe covers the whole of Haskell 98, and uses the [http://www.cse.ogi.edu/PacSoft/projects/programatica/ Programatica]<br />
system for its front end functionality.<br />
<br />
Unfortunately, HaRe does not cover the whole of GHC Haskell. The aim of<br />
this project is to port HaRe to the GHC API, so that HaRe can extend its<br />
user base (and indeed be used to refactor itself!). This project builds on<br />
a [http://www.cs.kent.ac.uk/pubs/2005/2266/content.pdf feasibility study by Chris Ryder], which covers much of the tricky<br />
preliminary investigative work.<br />
<br />
Mentor: Simon Thompson (s.j.thompson@kent.ac.uk)<br />
<br />
=== Refactoring to Classes ===<br />
<br />
Haskell has a powerful overloading mechanism with interfaces provided by<br />
type classes and bindings to those interfaces by instance declarations.<br />
It is natural during program development first to define a system without<br />
overloading, and then to identify ways in which it can be introduced. This<br />
might be by identifying a single set of functions to form the basis of a<br />
class, or by identifying two such sets, which are to share the same<br />
collection of names.<br />
<br />
The aim of the project is to identify the use cases which would be most<br />
helpful to users, and then to implement them in the Haskell Refactorer,<br />
[http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html HaRe],. A particularly fertile application area is in transformation<br />
of non-monadic code into a monadic version.<br />
<br />
Mentor: Simon Thompson (s.j.thompson@kent.ac.uk)<br />
<br />
=== UML for Haskell ===<br />
<br />
There has been some discussion on how to mix UML (or object oriented coding<br />
in general). Try to develop a tool that creates haskell out of UML<br />
in a suitable way. This project requires a lot of creativity on the part<br />
of the student. A toy project to test the implementation should be implemented<br />
as well.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
=== A diagram editor ===<br />
<br />
GNU Dia is a quite badly maintained program, and progress has been slow.<br />
Show them how it should be done by implementing a modularized diagram editor in<br />
haskell. Experience of using these programs is a merit, since a key point<br />
is to squash all the current usability problems in Dia.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3874Summer of Code/People2006-04-25T21:47:08Z<p>PaoloMartini: </p>
<hr />
<div>Those are the volunteers in charge of the Haskell.org organization for the purpose of the Google Summer of Code 2006 programme. We happily welcome more people, just add your project ideas on the [[Summer of Code: Project suggestions]] page and your personal informations here, or contact [mailto:paolo@nemail.it PaoloMartini] for details.<br />
<br />
== Administrators ==<br />
<br />
* Isaac Jones <http://www.syntaxpolice.org/>,<br />
* Don Stewart <http://www.cse.unsw.edu.au/~dons/>,<br />
* David Himmelstrup <http://darcs.haskell.org/~lemmih/aboutMe.html>.<br />
<br />
== Mentors ==<br />
<br />
* David Himmelstrup,<br />
* John Goerzen (CosmicRay) <http://www.complete.org/>,<br />
* Cale Gibbard <http://www.haskell.org/hawiki/CaleGibbard>,<br />
* Einar Karttunen (musasabi) <http://www.cs.helsinki.fi/u/ekarttun/>,<br />
* Shae Matijs Erisson (shapr) <http://www.ScannedInAvian.com/>,<br />
* Duncan Coutts (dcoutts) <http://haskell.org/gtk2hs/development/>,<br />
* Andres Löh (kosmikus) <http://www.iai.uni-bonn.de/~loeh>,<br />
* Ian Lynagh (Igloo) <http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/>,<br />
* Conal Elliott <http://conal.net/>,<br />
* Johan Henriksson (Mahogny) <http://www.mtek.chalmers.se/~johen/>,<br />
* Ketil Malde <[mailto:ketil@ii.uib.no ketil@ii.uib.no]>,<br />
* Björn Bringert <[mailto:bringert@cs.chalmers.se bringert@cs.chalmers.se]>,<br />
* Alberto Ruiz <[mailto:aruiz@um.es aruiz@um.es]>,<br />
* Simon Thompson <http://www.cs.kent.ac.uk/~sjt/>,<br />
* Andre Pang <http://www.algorithm.com.au/>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3873Summer of Code/People2006-04-25T20:58:25Z<p>PaoloMartini: </p>
<hr />
<div>Those are the volunteers in charge of the Haskell.org organization for the purpose of the Google Summer of Code 2006 programme. We happily welcome more people, just add your project ideas on the [[Summer of Code: Project suggestions]] page and your personal informations here, or contact [mailto:paolo@nemail.it PaoloMartini] for details.<br />
<br />
== Administrators ==<br />
<br />
* Isaac Jones <http://www.syntaxpolice.org/>,<br />
* Don Stewart <http://www.cse.unsw.edu.au/~dons/>,<br />
* David Himmelstrup <http://darcs.haskell.org/~lemmih/aboutMe.html>.<br />
<br />
== Mentors ==<br />
<br />
* David Himmelstrup,<br />
* John Goerzen (CosmicRay) <http://www.complete.org/>,<br />
* Cale Gibbard <http://www.haskell.org/hawiki/CaleGibbard>,<br />
* Einar Karttunen (musasabi) <http://www.cs.helsinki.fi/u/ekarttun/>,<br />
* Shae Matijs Erisson (shapr) <http://www.ScannedInAvian.com/>,<br />
* Duncan Coutts (dcoutts) <http://haskell.org/gtk2hs/development/>,<br />
* Andres Löh (kosmikus) <http://www.iai.uni-bonn.de/~loeh>,<br />
* Ian Lynagh (Igloo) <http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/>,<br />
* Conal Elliott <http://conal.net/>,<br />
* Johan Henriksson (Mahogny) <http://www.mtek.chalmers.se/~johen/>,<br />
* Ketil Malde <[mailto:ketil@ii.uib.no ketil@ii.uib.no]>,<br />
* Björn Bringert <[mailto:bringert@cs.chalmers.se bringert@cs.chalmers.se]>,<br />
* Alberto Ruiz <[mailto:aruiz@um.es aruiz@um.es]>,<br />
* Simon Thompson <http://www.cs.kent.ac.uk/~sjt/>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3872Summer of Code/Project suggestions2006-04-25T20:45:23Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for [[Summer of Code: People | mentors]] to add their ideas and to say which projects they'd be happy to supervise. It's also ok for other people to add their own ideas that are not yet claimed by a mentor. If you do this, could you please notify an admin person so that they can try and find a mentor for that project idea, because in the end we can only deal with project ideas that do have people prepared to mentor them. <br />
<br />
Students should not claim projects here, they must use the normal Google Summer of Code application process. See the [http://code.google.com/soc/studentfaq.html student FAQ] for details.<br />
<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
==== Port the Clean high performance string code ====<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Storable a => Vector a ====<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Unicode layer over Data.ByteString ====<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
==== Port Alex to Data.ByteString ====<br />
<br />
Port the [[Alex]] lexer generator to run with mmap'd Data.ByteStrings<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improve it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unofficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
It would be cool to see a library using ideas from [http://www.sandr.dds.nl/FunctionalForms/index.html FunctionalForms] in Gtk2Hs.<br />
<br />
=== Darcs GUI ===<br />
<br />
Design and implement a GUI front-end using wxhaskell for Darcs.<br />
<br />
Mentor: No-one.<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in [http://www.lua.org/ lua], but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi, ekarttun@cs.helsinki.fi)<br />
<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editor's internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
<br />
== Bindings ==<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== Matlab Binding ===<br />
<br />
Matlab/Octave is an excellent tool for quick imperative numerical programming.<br />
However, it would be much nicer if anyone wrote bindings such<br />
that it could be mixed with Haskell.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
=== GSL Binding ===<br />
<br />
Extend the [http://dis.um.es/~alberto/GSLHaskell GSLHaskell] library to cover all the [http://www.gnu.org/software/gsl/ GSL] functions. Implement (possibly using additional numerical libraries) important Octave functions not available in the GSL.<br />
<br />
Mentor: Alberto Ruiz (aruiz@um.es)<br />
<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen (musasabi, ekarttun@cs.helsinki.fi)<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== IPv6 and IPSec for House ===<br />
<br />
Implement IPv6 and maybe IPSec for the House (an operating system in Haskell). Needs mostly networking knowledge and ideas for binary data serialization.<br />
<br />
=== Distributed compilation ===<br />
<br />
A distcc-like tool for Distributed compilation of Haskell code<br />
<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations. (See [http://www.cse.unsw.edu.au/~dons/h4sh.html h4sh].)<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
<br />
== Databases ==<br />
<br />
=== [[Libraries and tools/Database interfaces/HaskellDB|HaskellDB]] ===<br />
<br />
==== Port HaskellDB to HList ====<br />
<br />
[[Libraries and tools/Database interfaces/HaskellDB|HaskellDB]] currently uses its own [[Extensible record|record system]], which (I believe) is less powerful than [http://homepages.cwi.nl/~ralf/HList/ HList]. The project is to port HaskellDB to use HList instead, making any necessary changes to the interface to make this possible and to fit HList better.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Implement back-end dependent SQL generation in HaskellDB ====<br />
<br />
Currently HaskellDB uses the same SQL generator for all database systems. Unfortunately different database systems support different SQL dialects. The project is to make it possible to use different SQL generators for different back-ends, and implement generators for common database systems such as for example MySQL, PostgreSQL and SQLite. The project could also include adding support for back-end specific SQL extensions (such as various string and date functions, non-standard field types etc.) to the HaskellDB query language.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Add support for optimization features in HaskellDB ====<br />
<br />
The projects is to added support for indexes, prepared statements and other optimization features to HaskellDB.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
<br />
== Tools ==<br />
<br />
=== HaRe in GHC ===<br />
<br />
The Haskell Refactorer, [http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html HaRe], is a tool for refactoring Haskell<br />
systems. HaRe handles multi-module systems, and respects layout and<br />
comments, so that refactored code looks as much as possible like the<br />
original. HaRe covers the whole of Haskell 98, and uses the [http://www.cse.ogi.edu/PacSoft/projects/programatica/ Programatica]<br />
system for its front end functionality.<br />
<br />
Unfortunately, HaRe does not cover the whole of GHC Haskell. The aim of<br />
this project is to port HaRe to the GHC API, so that HaRe can extend its<br />
user base (and indeed be used to refactor itself!). This project builds on<br />
a [http://www.cs.kent.ac.uk/pubs/2005/2266/content.pdf feasibility study by Chris Ryder], which covers much of the tricky<br />
preliminary investigative work.<br />
<br />
Mentor: Simon Thompson (s.j.thompson@kent.ac.uk)<br />
<br />
=== Refactoring to Classes ===<br />
<br />
Haskell has a powerful overloading mechanism with interfaces provided by<br />
type classes and bindings to those interfaces by instance declarations.<br />
It is natural during program development first to define a system without<br />
overloading, and then to identify ways in which it can be introduced. This<br />
might be by identifying a single set of functions to form the basis of a<br />
class, or by identifying two such sets, which are to share the same<br />
collection of names.<br />
<br />
The aim of the project is to identify the use cases which would be most<br />
helpful to users, and then to implement them in the Haskell Refactorer,<br />
[http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html HaRe],. A particularly fertile application area is in transformation<br />
of non-monadic code into a monadic version.<br />
<br />
Mentor: Simon Thompson (s.j.thompson@kent.ac.uk)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3870Summer of Code/People2006-04-25T18:25:21Z<p>PaoloMartini: </p>
<hr />
<div>Those are the volunteers in charge of the Haskell.org organization for the purpose of the Google Summer of Code 2006 programme. We happily welcome more people, just add your project ideas on the [[Summer of Code: Project suggestions]] page and your personal informations here, or contact [mailto:paolo@nemail.it PaoloMartini] for details.<br />
<br />
== Administrators ==<br />
<br />
* Isaac Jones <http://www.syntaxpolice.org/>,<br />
* Don Stewart <http://www.cse.unsw.edu.au/~dons/>,<br />
* David Himmelstrup <http://darcs.haskell.org/~lemmih/aboutMe.html>.<br />
<br />
== Mentors ==<br />
<br />
* David Himmelstrup,<br />
* John Goerzen (CosmicRay) <http://www.complete.org/>,<br />
* Cale Gibbard <http://www.haskell.org/hawiki/CaleGibbard>,<br />
* Einar Karttunen (musasabi) <http://www.cs.helsinki.fi/u/ekarttun/>,<br />
* Shae Matijs Erisson (shapr) <http://www.ScannedInAvian.com/>,<br />
* Duncan Coutts (dcoutts) <http://haskell.org/gtk2hs/development/>,<br />
* Andres Löh (kosmikus) <http://www.iai.uni-bonn.de/~loeh>,<br />
* Ian Lynagh (Igloo) <http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/>,<br />
* Conal Elliott <http://conal.net/>,<br />
* Johan Henriksson (Mahogny) <http://www.mtek.chalmers.se/~johen/>,<br />
* Ketil Malde <[mailto:ketil@ii.uib.no ketil@ii.uib.no]>.<br />
* Björn Bringert <[mailto:bringert@cs.chalmers.se bringert@cs.chalmers.se]>,<br />
* Alberto Ruiz <[mailto:aruiz@um.es aruiz@um.es]>,<br />
* Simon Thompson <http://www.cs.kent.ac.uk/~sjt/>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3861Summer of Code/People2006-04-25T15:38:48Z<p>PaoloMartini: Alberto Ruiz</p>
<hr />
<div>Those are the volunteers in charge of the Haskell.org organization for the purpose of the Google Summer of Code 2006 programme. We happily welcome more people, just add your project ideas on the [[Summer of Code: Project suggestions]] page and your personal informations here, or contact [mailto:paolo@nemail.it PaoloMartini] for details.<br />
<br />
== Administrators ==<br />
<br />
* Isaac Jones <http://www.syntaxpolice.org/>,<br />
* Don Stewart <http://www.cse.unsw.edu.au/~dons/>,<br />
* David Himmelstrup <http://darcs.haskell.org/~lemmih/aboutMe.html>.<br />
<br />
== Mentors ==<br />
<br />
* David Himmelstrup,<br />
* John Goerzen (CosmicRay) <http://www.complete.org/>,<br />
* Cale Gibbard <http://www.haskell.org/hawiki/CaleGibbard>,<br />
* Einar Karttunen (musasabi) <http://www.cs.helsinki.fi/u/ekarttun/>,<br />
* Shae Matijs Erisson (shapr) <http://www.ScannedInAvian.com/>,<br />
* Duncan Coutts (dcoutts) <http://haskell.org/gtk2hs/development/>,<br />
* Andres Löh (kosmikus) <http://www.iai.uni-bonn.de/~loeh>,<br />
* Ian Lynagh (Igloo) <http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/>,<br />
* Conal Elliott <http://conal.net/>,<br />
* Johan Henriksson (Mahogny) <http://www.mtek.chalmers.se/~johen/>,<br />
* Ketil Malde <[mailto:ketil@ii.uib.no ketil@ii.uib.no]>.<br />
* Björn Bringert <[mailto:bringert@cs.chalmers.se bringert@cs.chalmers.se]>,<br />
* Alberto Ruiz <[mailto:aruiz@um.es aruiz@um.es]>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3860Summer of Code/People2006-04-25T15:38:07Z<p>PaoloMartini: </p>
<hr />
<div>Those are the volunteers in charge of the Haskell.org organization for the purpose of the Google Summer of Code 2006 programme. We happily welcome more people, just add your project ideas on the [[Summer of Code: Project suggestions]] page and your personal informations here, or contact [mailto:paolo@nemail.it PaoloMartini] for details.<br />
<br />
== Administrators ==<br />
<br />
* Isaac Jones <http://www.syntaxpolice.org/>,<br />
* Don Stewart <http://www.cse.unsw.edu.au/~dons/>,<br />
* David Himmelstrup <http://darcs.haskell.org/~lemmih/aboutMe.html>.<br />
<br />
== Mentors ==<br />
<br />
* David Himmelstrup,<br />
* John Goerzen (CosmicRay) <http://www.complete.org/>,<br />
* Cale Gibbard <http://www.haskell.org/hawiki/CaleGibbard>,<br />
* Einar Karttunen (musasabi) <http://www.cs.helsinki.fi/u/ekarttun/>,<br />
* Shae Matijs Erisson (shapr) <http://www.ScannedInAvian.com/>,<br />
* Duncan Coutts (dcoutts) <http://haskell.org/gtk2hs/development/>,<br />
* Andres Löh (kosmikus) <http://www.iai.uni-bonn.de/~loeh>,<br />
* Ian Lynagh (Igloo) <http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/>,<br />
* Conal Elliott <http://conal.net/>,<br />
* Johan Henriksson (Mahogny) <http://www.mtek.chalmers.se/~johen/>,<br />
* Ketil Malde <[mailto:ketil@ii.uib.no ketil@ii.uib.no]>.<br />
* Björn Bringert <[mailto:bringert@cs.chalmers.se bringert@cs.chalmers.se]>,<br />
* Alberto Ruiz <[mailto:aruiz@um.es]>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3838Summer of Code/Project suggestions2006-04-24T18:06:06Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for [[Summer of Code: People | mentors]] to add their ideas and to say which projects they'd be happy to supervise. It's also ok for other people to add their own ideas that are not yet claimed by a mentor. If you do this, could you please notify an admin person so that they can try and find a mentor for that project idea, because in the end we can only deal with project ideas that do have people prepared to mentor them. <br />
<br />
Students should not claim projects here, they must use the normal Google Summer of Code application process. See the [http://code.google.com/soc/studentfaq.html student FAQ] for details.<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Distributed compilation ===<br />
<br />
A-la distcc, the distributed compilation of Haskell modules.<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Unicode layer over Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improve it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Port the Clean high performance string code ===<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unofficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
It would be cool to see a library using ideas from [http://www.sandr.dds.nl/FunctionalForms/index.html FunctionalForms] in Gtk2Hs.<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in Ion, but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi)<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editors internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
== Bindings ==<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== Matlab Binding ===<br />
<br />
Matlab is an excellent tool for quick imperative numerical programming.<br />
However, it would be much nicer if anyone wrote bindings such<br />
that it could be mixed with Haskell.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Databases ==<br />
<br />
=== HaskellDB ===<br />
<br />
==== Port HaskellDB to HList ====<br />
<br />
HaskellDB currently uses its own record system, which (I believe) is less powerful than HList. The project is to port HaskellDB to use HList instead, making any necessary changes to the interface to make this possible and to fit HList better.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Implement back-end dependent SQL generation in HaskellDB ====<br />
<br />
Currently HaskellDB uses the same SQL generator for all database systems. Unfortunately different database systems support different SQL dialects. The project is to make it possible to use different SQL generators for different back-ends, and implement generators for common database systems such as for example MySQL, PostgreSQL and SQLite. The project could also include adding support for back-end specific SQL extensions (such as various string and date functions, non-standard field types etc.) to the HaskellDB query language.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3837Summer of Code/Project suggestions2006-04-24T18:04:46Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for [[Summer of Code: People | mentors]] to add their ideas and to say which projects they'd be happy to supervise. It's also ok for other people to add their own ideas that are not yet claimed by a mentor. If you do this, could you please notify an admin person so that they can try and find a mentor for that project idea, because in the end we can only deal with project ideas that do have people prepared to mentor them. <br />
<br />
Students should not claim projects here, they must use the normal Google Summer of Code application process. See the [http://code.google.com/soc/studentfaq.html student FAQ] for details.<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Distributed compilation ===<br />
<br />
A-la distcc, the distributed compilation of Haskell modules.<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Unicode layer over Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improve it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Port the Clean high performance string code ===<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unofficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
It would be cool to see a library using ideas from [http://www.sandr.dds.nl/FunctionalForms/index.html FunctionalForms] in Gtk2Hs.<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in Ion, but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi)<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editors internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
== Bindings ==<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
== Matlab Binding ==<br />
<br />
Matlab is an excellent tool for quick imperative numerical programming.<br />
However, it would be much nicer if anyone wrote bindings such<br />
that it could be mixed with Haskell.<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny, johen@student.chalmers.se)<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Databases ==<br />
<br />
=== HaskellDB ===<br />
<br />
==== Port HaskellDB to HList ====<br />
<br />
HaskellDB currently uses its own record system, which (I believe) is less powerful than HList. The project is to port HaskellDB to use HList instead, making any necessary changes to the interface to make this possible and to fit HList better.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Implement back-end dependent SQL generation in HaskellDB ====<br />
<br />
Currently HaskellDB uses the same SQL generator for all database systems. Unfortunately different database systems support different SQL dialects. The project is to make it possible to use different SQL generators for different back-ends, and implement generators for common database systems such as for example MySQL, PostgreSQL and SQLite. The project could also include adding support for back-end specific SQL extensions (such as various string and date functions, non-standard field types etc.) to the HaskellDB query language.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3833Summer of Code/Project suggestions2006-04-24T17:51:53Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for [[Summer of Code: People | mentors]] to add their ideas and to say which projects they'd be happy to supervise. Students should not claim projects here however, but using the normal Google Summer of Code application process, see the [http://code.google.com/soc/studentfaq.html student FAQ] for details.<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Distributed compilation ===<br />
<br />
A-la distcc, the distributed compilation of Haskell modules.<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Unicode layer over Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improve it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Port the Clean high performance string code ===<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unoficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in Ion, but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi)<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editors internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny)<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Databases ==<br />
<br />
=== HaskellDB ===<br />
<br />
==== Port HaskellDB to HList ====<br />
<br />
HaskellDB currently uses its own record system, which (I believe) is less powerful than HList. The project is to port HaskellDB to use HList instead, making any necessary changes to the interface to make this possible and to fit HList better.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)<br />
<br />
==== Implement back-end dependent SQL generation in HaskellDB ====<br />
<br />
Currently HaskellDB uses the same SQL generator for all database systems. Unfortunately different database systems support different SQL dialects. The project is to make it possible to use different SQL generators for different back-ends, and implement generators for common database systems such as for example MySQL, PostgreSQL and SQLite. The project could also include adding support for back-end specific SQL extensions (such as various string and date functions, non-standard field types etc.) to the HaskellDB query language.<br />
<br />
Mentor: Björn Bringert (bringert@cs.chalmers.se)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3828Summer of Code/Project suggestions2006-04-24T15:44:21Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for mentors to add their ideas and to say which projects they'd be happy to supervise. Students should not claim projects here however, but using the normal Google Summer of Code application process, see the [http://code.google.com/soc/studentfaq.html student FAQ] for details.<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Distributed compilation ===<br />
<br />
A-la distcc, the distributed compilation of Haskell modules.<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Unicode layer over Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improve it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Port the Clean high performance string code ===<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unoficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in Ion, but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi)<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editors internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny)<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3825Summer of Code/Project suggestions2006-04-24T14:08:58Z<p>PaoloMartini: Big refactorization, categorization.</p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for mentors to add their ideas and to say which projects they'd be happy to supervise. Students should not claim projects here however, but using the normal Google Summer of Code application process, see the [http://code.google.com/soc/studentfaq.htm student FAQ] for details.<br />
<br />
== Cabal ==<br />
<br />
=== Cabal-get/HackageDB ===<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
== GHC ==<br />
<br />
=== GhcPlugins ===<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Implement various debugging tools in GHC ===<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih (lemmih@gmail.com)<br />
<br />
=== Handle recursive modules in GHC ===<br />
<br />
=== Incremental Garbage Collector for GHC ===<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
=== Parsers for various programming languages ===<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Unicode layer over Data.ByteString ===<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Improve performance of numerical code ===<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improive it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Port the Clean high performance string code ===<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Graphics ==<br />
<br />
=== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ===<br />
<br />
=== Gtk / Graphics / GNOME related projects ===<br />
<br />
I'd be happy to accept projects in this area. Last year I was unoficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== D-BUS Binding ===<br />
<br />
Haskell bindings to the [http://www.freedesktop.org/wiki/Software/dbus D-BUS] message bug system, a simple way for applications to talk to one another. <br />
<br />
Mentor: Duncan Coutts<br />
<br />
=== Embed ghci/ghci-api in ion ===<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in Ion, but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Web development ==<br />
<br />
=== Continuation based DSL on top of HAppS ===<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi)<br />
<br />
== Editing ==<br />
<br />
=== Port ghc-api's eval mechanism to Yi ===<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editors internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) and Lemmih (lemmih@gmail.com).<br />
<br />
=== Yi projects ===<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
=== Generic Hide Hacking ===<br />
* Rewrite plugins for the new plugin-system.<br />
* Integration with [[Lambdabot]], access to plugins through Hide.<br />
* Other?<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), Lemmih (lemmih@gmail.com)<br />
<br />
== Games ==<br />
<br />
=== Frag hacking ===<br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
=== Students' ideas / Games ===<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny)<br />
<br />
== Bioinformatics ==<br />
<br />
=== Bioinformatics tools ===<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
== Concurrency / Network ==<br />
<br />
=== Concurrent disk-based data structures ===<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen<br />
<br />
=== Haskellnet ===<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr@scannedinavian.com)<br />
<br />
== UNIX ==<br />
<br />
=== A Haskell shell ===<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3824Summer of Code/People2006-04-24T13:50:37Z<p>PaoloMartini: </p>
<hr />
<div>Those are the volunteers in charge of the Haskell.org organization for the purpose of the Google Summer of Code 2006 programme. We happily welcome more people, just add your project ideas on the [[Summer of Code: Project suggestions]] page and your personal informations here, or contact [mailto:paolo@nemail.it PaoloMartini] for details.<br />
<br />
== Administrators ==<br />
<br />
* Isaac Jones <http://www.syntaxpolice.org/>,<br />
* Donald Bruce Steward <http://www.cse.unsw.edu.au/~dons/>,<br />
* David Himmelstrup <http://darcs.haskell.org/~lemmih/aboutMe.html>. <br />
<br />
== Mentors ==<br />
<br />
* David Himmelstrup,<br />
* John Goerzen (CosmicRay) <http://www.complete.org/>,<br />
* Cale Gibbard <http://www.haskell.org/hawiki/CaleGibbard>,<br />
* Einar Karttunen (musasabi) <http://www.cs.helsinki.fi/u/ekarttun/>,<br />
* Shae Matijs Erisson (shapr) <http://www.ScannedInAvian.com/>,<br />
* Duncan Coutts (dcoutts) <http://haskell.org/gtk2hs/development/>,<br />
* Andres Löh (kosmikus) <http://www.iai.uni-bonn.de/~loeh>,<br />
* Ian Lynagh (Igloo) <http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/>,<br />
* Conal Elliot <http://conal.net/>,<br />
* Johan Henriksson (Mahogny) <http://www.mtek.chalmers.se/~johen/>,<br />
* Ketil Malde <[mailto:ketil@ii.uib.no ketil@ii.uib.no]>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/People&diff=3821Summer of Code/People2006-04-24T13:26:22Z<p>PaoloMartini: </p>
<hr />
<div>Those are the volunteers in charge of the Haskell.org organization for the purpose of the Google Summer of Code 2006 programme. We happily welcome more people, just add your project ideas on the [[Summer of Code: Project suggestions]] page and your personal informations here, or contact [mailto:paolo@nemail.it PaoloMartini] for details.<br />
<br />
== Administrators ==<br />
<br />
* Isaac Jones <http://www.syntaxpolice.org/>,<br />
* Donald Bruce Steward <http://www.cse.unsw.edu.au/~dons/>,<br />
* David Himmelstrup <http://darcs.haskell.org/~lemmih/aboutMe.html>. <br />
<br />
== Mentors ==<br />
<br />
* David Himmelstrup,<br />
* John Goerzen <http://www.complete.org/>,<br />
* Cale Gibbard <http://www.haskell.org/hawiki/CaleGibbard>,<br />
* Einar Karttunen <http://www.cs.helsinki.fi/u/ekarttun/>,<br />
* Shae Matijs Erisson <http://www.ScannedInAvian.com/>,<br />
* Duncan Coutts <http://haskell.org/gtk2hs/development/>,<br />
* Andres Löh <http://www.iai.uni-bonn.de/~loeh>,<br />
* Ian Lynagh <http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/>,<br />
* Conal Elliot <http://conal.net/>.</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3818Summer of Code/Project suggestions2006-04-24T11:51:04Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for mentors to add their ideas and to say which projects they'd be happy to supervise. It is also for students to see what kinds of projects are available. Students should not claim projects here however, but use the normal Google SoC application process. Mentors feel free to write your name under orphaned projects.<br />
<br />
== Cabal-get/HackageDB ==<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih<br />
<br />
== GhcPlugins ==<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih<br />
<br />
== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ==<br />
<br />
== Implement various debugging tools in GHC ==<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih<br />
<br />
== Handle recursive modules in GHC ==<br />
<br />
== Gtk / Graphics / GNOME related projects ==<br />
<br />
I'd be happy to accept projects in this area. Last year I was unoficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. Possible ideas include a [http://www.freedesktop.org/wiki/Software/dbus dbus] binding. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
== Incremental GC for GHC ==<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
== hs-plugins based web server ==<br />
<br />
Build an industrial-strength CGI/FastCGI/etc daemon to be used for enterprise-type web applications.<br />
<br />
HSP does have the hs-plugins part. So do new versions of WASH. In HAppS the enterprise part is keeping us away from hs-plugins, if it were for research only there would be hs-plugins support (4-8 hours of work).<br />
<br />
== Continuation based DSL on top of HAppS ==<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi)<br />
<br />
== Parsers for various programming languages ==<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr)<br />
<br />
== Yi projects ==<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr)<br />
<br />
== Students' ideas / Game ==<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny)<br />
<br />
== Bioinformatics tools ==<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
== Concurrent disk-based data structures ==<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen<br />
<br />
== Haskellnet ==<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].<br />
<br />
Mentor: Shae Matijs Erisson (shapr)<br />
<br />
== Port ghc-api's eval mechanism to Yi ==<br />
<br />
Yi is an editor written and extensible in Haskell. Construct a binding<br />
to ghc-api such that new expressions may be evaluated at runtime in the<br />
editor, accessing the editors internal structures in a type safe way,<br />
dynamically. elisp for Haskell!<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au) (and Lemmih?)<br />
<br />
== Data.ByteString == <br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to arbitrary (Storable a) arrays. Data.ByteString provides a<br />
high performance api to arrays of bytes. Generalise this to arbitrary<br />
vectors of Storable a values, winning fame and glory in the process.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Unicode layer over Data.ByteString ==<br />
<br />
Extend the [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
interface to support Unicode.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Hide integration with [[Lambdabot]], access to plugins through Hide ==<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au), (Lemmih?)<br />
<br />
== A Haskell shell ==<br />
<br />
Concise syntax and higher order functions would make a Haskell shell<br />
very useful. This project would aim to produce a real world shell <br />
written in Haskell, and using an embedded domain specific language to<br />
encode common operations.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Embed ghci/ghci-api in ion ==<br />
<br />
[http://modeemi.cs.tut.fi/~tuomov/ion/ ion] is a cool window manager<br />
written by Tuomo Valkonen, a Haskell hacker. It is currently extensible<br />
in Ion, but a very interesting project would be to work out how to<br />
dynamically extend it in Haskell, perhaps using ideas from<br />
[http://www.cse.unsw.edu.au/~dons/yi.html Yi].<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Improve performance of numerical code ==<br />
<br />
GHC's performance for double and float intensive code is not as good as<br />
it could be. Find out why and improive it. Requires GHC backend hacking.<br />
Must be very Haskell literate or have knowledge of code generators.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Port the Clean high performance string code ==<br />
<br />
Clean does very well for low level string benchmarks. Find out what<br />
they do, and port it to [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString]<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)<br />
<br />
== Frag hacking == <br />
<br />
[[Frag]] is a 3d first person shootup game written in Haskell,<br />
using OpenGL. It can be greatly extended in all sorts of ways. If<br />
you're in to gaming, have a look at this.<br />
<br />
Mentor: Don Stewart (dons@cse.unsw.edu.au)</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3816Summer of Code/Project suggestions2006-04-24T10:04:40Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for mentors to add their ideas and to say which projects they'd be happy to supervise. It is also for students to see what kinds of projects are available. Students should not claim projects here however, but use the normal Google SoC application process. Mentors feel free to write your name under orphaned projects.<br />
<br />
== Cabal-get/HackageDB ==<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih<br />
<br />
== GhcPlugins ==<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih<br />
<br />
== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ==<br />
<br />
== Implement various debugging tools in GHC ==<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih<br />
<br />
== Handle recursive modules in GHC ==<br />
<br />
== Gtk / Graphics / GNOME related projects ==<br />
<br />
I'd be happy to accept projects in this area. Last year I was unoficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. Possible ideas include a [http://www.freedesktop.org/wiki/Software/dbus dbus] binding. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
== Incremental GC for GHC ==<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
== hs-plugins based web server ==<br />
<br />
Build an industrial-strength CGI/FastCGI/etc daemon to be used for enterprise-type web applications.<br />
<br />
HSP does have the hs-plugins part. So do new versions of WASH. In HAppS the enterprise part is keeping us away from hs-plugins, if it were for research only there would be hs-plugins support (4-8 hours of work).<br />
<br />
== Continuation based DSL on top of HAppS ==<br />
<br />
Do you have a vision how to do better than WASH? Integrate continuation based interaction with client or use something like Functional Forms for the interaction. How to best to interact with XML etc. Other HAppS related projects<br />
also possible.<br />
<br />
Mentor: Einar Karttunen (musasabi)<br />
<br />
== Parsers for various programming languages ==<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr)<br />
<br />
== Yi projects ==<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr)<br />
<br />
== Students' ideas / Game ==<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny)<br />
<br />
== Bioinformatics tools ==<br />
<br />
1. Further develop RBR, a tool for masking repeats. This can include<br />
a) optimize (using FastPackedString and/or a new internal data structure); b) extend functionality.<br />
<br />
2. Develop a tool for annotation/classification of sequences. This would involve computation on and visualization of graphs (experience with the latter would be really great).<br />
<br />
Prior bioinformatics knowledge is not a requirement. Please contact me for details.<br />
<br />
Mentor: Ketil ([mailto:ketil@ii.uib.no ketil@ii.uib.no])<br />
<br />
== Concurrent disk-based data structures ==<br />
<br />
Implement B+tree or a variant supporting concurrent updates using STM,<br />
serialize updates into a write ahead log and provide for serialization.<br />
Bind the whole thing with a nice HaskellDB like API. Variations on<br />
the theme possible.<br />
<br />
Mentor: Einar Karttunen<br />
<br />
== Haskellnet ==<br />
<br />
We have got cgi, ftp, http, and irc. Get them into shape in the hierarchical libraries as well as adding a number of other protocols, like nntp, smtp and pop3, imap4, ... much like the [http://ocamlnet.sourceforge.net/doc/goals/goals.html Ocamlnet project].</div>PaoloMartinihttps://wiki.haskell.org/index.php?title=Summer_of_Code/Project_suggestions&diff=3798Summer of Code/Project suggestions2006-04-23T22:05:10Z<p>PaoloMartini: </p>
<hr />
<div>Haskell projects for Google's Summer of Code.<br />
<br />
This page is for mentors to add their ideas and to say which projects they'd be happy to supervise. It is also for students to see what kinds of projects are available. Students should not claim projects here however, but use the normal Google SoC application process. Mentors feel free to write your name under orphaned projects.<br />
<br />
== Cabal-get/HackageDB ==<br />
Cabal-get is an automatic installer for Cabal libraries.<br />
The goal is to distribute the program with [http://haskell.org/cabal Cabal], but to achieve this we need to cut almost all of its dependencies. This project should be fairly easy (the code base of cabal-get is only 1K loc).<br />
<br />
Mentor: Lemmih<br />
<br />
== GhcPlugins ==<br />
Write a new plugin system using the new ghc-api. Enough of the groundwork has been laid out now that someone with a few months and some background could finish up the work.<br />
<br />
GhcPlugins will replace the plugin system currently used in [http://haskell.org/hide hIDE].<br />
<br />
Mentor: Lemmih<br />
<br />
== Fix HsSDL (Haskell [http://libsdl.org libSDL] bindings) on Windows and MacOS ==<br />
<br />
== Implement various debugging tools in GHC ==<br />
* Dynamic breakpoints.<br />
* Generic object viewer.<br />
* Simple CCS for providing stack traces on exceptions and breakpoints.<br />
<br />
Mentor: Lemmih<br />
<br />
== Handle recursive modules in GHC ==<br />
<br />
== Gtk / Graphics / GNOME related projects ==<br />
<br />
I'd be happy to accept projects in this area. Last year I was unoficial mentor to Paolo who did the [http://www.cairographics.org/ cairo] bindings. Possible ideas include a [http://www.freedesktop.org/wiki/Software/dbus dbus] binding. (Feel free to add more ideas here or I might do as I think of them.)<br />
<br />
Mentor: Duncan Coutts<br />
<br />
== Incremental GC for GHC ==<br />
<br />
Implementing the incremental garbage collection algorithm described in the paper [http://research.microsoft.com/~simonpj/Papers/inc-gc.htm Non-stop Haskell] in GHC.<br />
<br />
== hs-plugins based web server ==<br />
<br />
Build an industrial-strength CGI/FastCGI/etc daemon to be used for enterprise-type web applications.<br />
<br />
== Parsers for various programming languages ==<br />
<br />
Populate the [http://haskell.org/ghc/docs/latest/html/libraries/index.html Language] hierarchy of modules with new parsers for many languages, at the moment it does only contain Language.Haskell.<br />
<br />
Mentor: Shae Matijs Erisson (shapr)<br />
<br />
== Yi projects ==<br />
<br />
Syntax Highlighting, Plugins. It's quite a peculiar kind of application. Its design is based on [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html type-safe dynamically loadable modules] and it is [http://www.cse.unsw.edu.au/~dons/papers/PSSC04.html more dynamic than Emacs]!<br />
<br />
Mentor: Shae Matijs Erisson (shapr)<br />
<br />
== Students' ideas / Game ==<br />
<br />
I'm ready to take on anyone willing to write a useful application or game (preferably a program) given that it is of reasonable size (upper limitaton).<br />
<br />
Mentor: Johan Henriksson (Mahogny)</div>PaoloMartini