[Haskell-cafe] Multi Line String literals
Hello, Just for fun I'm trying to define multi line string literals. I have the following code and I'm wondering if it can be improved (understandability, elegance, performance): http://hpaste.org/1582 (look at the second annotation) regards, Bas van Dijk ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Multi Line String literals
On 26/04/07, Bas van Dijk <[EMAIL PROTECTED]> wrote: test = putStrLn $ toIsString $ do "I" "need" "MultiLine" "String" "literals!" but it's simpler to just write something like: test = putStr $ unlines ["I", "need", "multiline", "string", "literals"] - Joe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Multi Line String literals
On Thu, Apr 26, 2007 at 01:43:09PM +0100, Joe Thornber wrote: > On 26/04/07, Bas van Dijk <[EMAIL PROTECTED]> wrote: > >test = putStrLn $ toIsString $ do "I" > > "need" > > "MultiLine" > > "String" > > "literals!" > > but it's simpler to just write something like: > > test = putStr $ unlines ["I", > "need", > "multiline", > "string", > "literals"] How does test = putStr "I\n\ \need\n\ \multiline\n\ \string\n\ \literals\n" look? Stefan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Multi Line String literals
Hi How does test = putStr "I\n\ \need\n\ \multiline\n\ \string\n\ \literals\n" look? Like the cpp will choke and die :) Multiline string literals were one of the motivations for cpphs. Thanks Neil ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Multi Line String literals
Hallo, On 4/26/07, Neil Mitchell <[EMAIL PROTECTED]> wrote: Like the cpp will choke and die :) Multiline string literals were one of the motivations for cpphs. Does cpphs allow me to include a whole file into a Haskell source file, inserting automatically the string gaps? -- -alex http://www.ventonegro.org/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Multi Line String literals
Hi Does cpphs allow me to include a whole file into a Haskell source file, inserting automatically the string gaps? No, but Hugs does with "Here documents". Thanks Neil ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Multi Line String literals
Hallo, On 4/26/07, Neil Mitchell <[EMAIL PROTECTED]> wrote: No, but Hugs does with "Here documents". Unfortunately I'm using GHC but thanks! Cheers, -- -alex http://www.ventonegro.org/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Multi Line String literals
Alex Queiroz <[EMAIL PROTECTED]> wrote: > On 4/26/07, Neil Mitchell <[EMAIL PROTECTED]> wrote: > > Like the cpp will choke and die :) Multiline string literals were one > > of the motivations for cpphs. > > Does cpphs allow me to include a whole file into a Haskell source > file, inserting automatically the string gaps? My hinstaller library certainly does. Though it currently allows you to only output that file to another file. I could easily improve it to allow output to a Handle. http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hinstaller Matthew ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: Compilling GHC on Vista
Claus Reinke wrote: gcc version 3.4.2 (mingw-special) configure:3288: $? = 0 configure:3295: c:/MinGW/bin/gcc -V >&5 gcc.exe: `-V' option must have argument configure:3298: $? = 1 configure:3321: checking for C compiler default output file name configure:3348: c:/MinGW/bin/gccconftest.c >&5 ld: /mingw/lib/crt2.o: No such file: No such file or directory not sure whether this is relevant, but there is no drive letter in that library path. cygwin doesn't know about /mingw anyway, but if i am in a cmd shell, it does matter what drive i'm on, as absolute paths without drive letter will default to the root of that drive: D:\>c:\mingw\bin\ld \mingw\lib\crt2.o -M | find "OUTPUT" c:\mingw\bin\ld: \mingw\lib\crt2.o: No such file: No such file or directory C:\>c:\mingw\bin\ld \mingw\lib\crt2.o -M | find "OUTPUT" .. OUTPUT(a.exe pei-i386) I suspect this may be because gcc has managed to pick up the Cygwin ld instead of the mingw one. Monique - what exactly is your PATH? What happens when you say 'ld --version'? Cheers, Simon ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Compilling GHC on Vista
I suspect this may be because gcc has managed to pick up the Cygwin ld instead of the mingw one. Monique - what exactly is your PATH? What happens when you say 'ld --version'? 'ld --version' doesn't show differences between mingw/cygwin, does it? and even the mingw ld apparently sets its search_dirs without drive letters: $ type -ap ld /cygdrive/c/MinGW/bin/ld $ ld --verbose | head GNU ld version 2.16.91 20050827 Supported emulations: i386pe using internal linker script: == /* Default linker script, for normal executables */ OUTPUT_FORMAT(pei-i386) SEARCH_DIR("/mingw/mingw32/lib"); SEARCH_DIR("/mingw/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib"); ENTRY(_mainCRTStartup) SECTIONS and, even under a cygwin bash calling a mingw ld, this won't work if we're not on the drive on which /mingw was installed: $ pwd /cygdrive/d $ ld /mingw/lib/crt2.o -M | grep OUTPUT c:\MinGW\bin\ld.exe: /mingw/lib/crt2.o: No such file: No such file or directory whereas: $ cd c: $ ld /mingw/lib/crt2.o -M | grep OUTPUT .. OUTPUT(a.exe pei-i386) claus ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Getting the number of seconds since epoch from System.Time.ClockTime
Hello haskell-cafe, In System.Time, data ClockTime = TOD Integer Integer , where the first integer represents the number of seconds since epoch, and the other represents the number of picoseconds. Is there a way of retrieving the first part? (In Haskell 98, the ClockTime type is abstract). TIA Martin My music: http://www.youtube.com/profile?user=thetonegrove ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Compilling GHC on Vista
and even the mingw ld apparently sets its search_dirs without drive letters: that shouldn't be the problem, though, as the failing part of ./configure was an indirect call via gcc, which seems to set the library prefixes correctly, when calling collect2 (see > below). it was just that the error message looked exactly right. Monique, perhaps you could send the output from the little test below, on your system, to compare (win/xp here)? claus $ pwd /cygdrive/d/tmp $ cat t.c int main() { exit(0); } $ c:/MinGW/bin/gcc --verbose t.c Reading specs from c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/specs Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=min gw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --dis able-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --w ithout-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchroniz ation --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.2 (mingw-special) c:/MinGW/bin/../libexec/gcc/mingw32/3.4.2/cc1.exe -quiet -v -iprefix c:\MinGW\bin\../lib/gcc/mingw3 2/3.4.2/ t.c -quiet -dumpbase t.c -auxbase t -version -o C:\DOCUME~1\cr3\LOCALS~1\Temp/ccE5.s ignoring nonexistent directory "c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../mingw32/include" ignoring nonexistent directory "/mingw/include" ignoring nonexistent directory "/mingw/include" ignoring nonexistent directory "/mingw/lib/gcc/mingw32/3.4.2/include" ignoring nonexistent directory "/mingw/mingw32/include" ignoring nonexistent directory "/mingw/include" #include "..." search starts here: #include <...> search starts here: c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/include End of search list. GNU C version 3.4.2 (mingw-special) (mingw32) compiled by GNU C version 3.4.2 (mingw-special). GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=130830 c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../mingw32/bin/as.exe -o C:\DOCUME~1\cr3\LOCALS~1\Temp/cc80baaa.o C:\DOCUME~1\cr3\LOCALS~1\Temp/ccE5.s c:/MinGW/bin/../libexec/gcc/mingw32/3.4.2/collect2.exe -Bdynamic c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../crt2.o c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/crtbegin.o -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.2 -Lc:/MinGW/bin/../lib/gcc -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../mingw32/lib -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../.. C:\DOCUME~1\cr3\LOCALS~1\Temp/cc80baaa.o -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt c:/MinGW/bin/../lib/gcc/mingw32/3.4.2/crtend.o ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: [Haskell] Newbie: what are the advantages of Haskell?
The biggest advantage of Haskell to me is that it helps me write better programs in other languages. For one reason or another Haskell never turns out to be my final implementation language my my programs gain in the process. Joel -- http://wagerlabs.com/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Haskell Job Opportunity
HAppS LLC has part-time and full-time positions open for haskell programmers to: * improve the open source haskell codebase at HAppS.org * implement infrastructure to make it work well in Amazon S3/EC2 environments * make http://pass.net reliable enough to be used by live apps * build the mass market apps we want to run on top of the HAppS/Pass.net platform We are looking for people who: * have substantial experience programming Haskell * have experience building Internet apps (not necessarily in Haskell but would be good), and * live in any of these places: * the Internet (with comfort working entirely over email,skype,tightVNC etc.) * New York * San Francisco * Los Angeles If you qualify and are interested, please send an email with your cv/resume to me or to AT . -Alex- ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Stack overflow with my Trie implementation
I've modified my Norvig spelling corrector to use a trie instead of Data.Map in the hopes of improving performance. Plus, this is fun and a great learning exercise for me. Unfortunately, when I load my trie with a large amount of data, I get a stack overflow. It's unclear to me why this is happening. I specifically use foldl' to avoid this situation when building my trie. Could someone shed some light on the situation for me? Here is the code: > module Main where > > import Data.List (foldl') > import Data.Maybe (maybe, fromMaybe) > import Prelude hiding (lookup) > import qualified Data.Map as M > > data Trie a = T (Maybe a) (M.Map Char (Trie a)) deriving (Show) > > main = do > -- big.txt is a large file of words: http://www.norvig.com/big.txt > c <- readFile "big.txt" > let freqTrie = foldl' incWordCount empty (words c) > print $ lookup "evening" freqTrie > where > incWordCount m w = insertWith (+) w 1 m > > empty :: Trie a > empty = T Nothing M.empty > > lookup :: String -> Trie a -> Maybe a > lookup ([]) (T Nothing m) = Nothing > lookup ([]) (T (Just v) m) = return v > lookup (k:ks) (T _m) = case M.lookup k m of > Nothing -> Nothing > Just trie -> lookup ks trie > > findWithDefault :: a -> String -> Trie a -> a > findWithDefault v k t = fromMaybe v (lookup k t) > > member :: String -> Trie a -> Bool > member k t = maybe False (const True) (lookup k t) > > insertWith :: (a -> a -> a) -> String -> a -> Trie a -> Trie a > insertWith fn ([]) v (T Nothing m) = T (Just v) m > insertWith fn ([]) v (T (Just v') m) = T (Just $ fn v v') m > insertWith fn (k:ks) v (T mvm) = T mv (M.insertWith const k newtrie m) > where > oldtrie = M.findWithDefault empty k m > newtrie = insertWith fn ks v oldtrie > > {-- I also tried to use this line instead of the one above to see > if this had any impact. Unfortunately, I obtained the same > results. > > insertWith fn ([]) v (T (Just v') m) = let x = fn v v' in seq x T (Just x) m > --} ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack overflow with my Trie implementation
Pete Kazmier wrote: I've modified my Norvig spelling corrector to use a trie instead of Data.Map in the hopes of improving performance. Plus, this is fun and a great learning exercise for me. Unfortunately, when I load my trie with a large amount of data, I get a stack overflow. It's unclear to me why this is happening. I specifically use foldl' to avoid this situation when building my trie. Could someone shed some light on the situation for me? Here is the code: module Main where import Data.List (foldl') import Data.Maybe (maybe, fromMaybe) import Prelude hiding (lookup) import qualified Data.Map as M data Trie a = T (Maybe a) (M.Map Char (Trie a)) deriving (Show) Try making it strict in the Map field.. > data Trie a = T (Maybe a) !(M.Map Char (Trie a)) deriving (Show) Regards -- Adrian Hey ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack overflow with my Trie implementation
Adrian Hey wrote: Pete Kazmier wrote: I've modified my Norvig spelling corrector to use a trie instead of Data.Map in the hopes of improving performance. Plus, this is fun and a great learning exercise for me. Unfortunately, when I load my trie with a large amount of data, I get a stack overflow. It's unclear to me why this is happening. I specifically use foldl' to avoid this situation when building my trie. Could someone shed some light on the situation for me? Here is the code: module Main where import Data.List (foldl') import Data.Maybe (maybe, fromMaybe) import Prelude hiding (lookup) import qualified Data.Map as M data Trie a = T (Maybe a) (M.Map Char (Trie a)) deriving (Show) Try making it strict in the Map field.. > data Trie a = T (Maybe a) !(M.Map Char (Trie a)) deriving (Show) Hmm, strictness is a slippery thing, so I think you'll also need to use strict insertion for the Map. I believe such a thing was added a while back, but with your code you could use >insertWith fn (k:ks) v (T mv m) = newtrie `seq` T mv (M.insert k newtrie m) > where > oldtrie = M.findWithDefault empty k m > newtrie = insertWith fn ks v oldtrie BTW, if you use strict insertion function (insertWith') it shouldn't be necessary to do a lookup first. Regards -- Adrian Hey ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] ANN: London Haskell User Group
I am delighted to announce the first meeting of the London Haskell User Group on Wednesday 23rd May from 6:30PM. The meeting will be held at City University's main campus in central London, and Simon Peyton Jones will be coming to give a talk. Please see the announcement on the web page for more details and to register: http://www.londonhug.net/2007/04/26/announcement-first-meeting-of-the- london-haskell-user-group/ Many thanks to Simon, and to Ross Paterson at City University for organising the room. Regards, Neil ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Obscure instances for Obscure types
Hi I currently maintain two libraries, TagSoup which defines the Tag data type, and BinaryDefer, which defines the BinaryDefer class. If I wanted to include an instance for BinaryDefer Tag, where would I put it? Putting it in either library introduces an artificial dependency on the other. Putting it in a separate libary makes the library about 4 lines long and is just annoying. Putting it in the individual application(s) is exactly what libraries were designed to avoid. Is there a solution? Thanks Neil ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Obscure instances for Obscure types
I've had a similar question, which I think boiled down to a compilation issue. Consider packages A and B that can be defined independently. But, just as Neil pointed out, perhaps A and B could also interact beyond their basic definition. My naive idea is that A would compile the simple independent way if B wasn't around and vice versa. But if A and B were both present at compile time, then their interaction would also be compiled. The open question is then where does that interaction live? I would guess this problem has been solved in other systems. Anything come to mind? On 4/26/07, Neil Mitchell <[EMAIL PROTECTED]> wrote: Hi I currently maintain two libraries, TagSoup which defines the Tag data type, and BinaryDefer, which defines the BinaryDefer class. If I wanted to include an instance for BinaryDefer Tag, where would I put it? Putting it in either library introduces an artificial dependency on the other. Putting it in a separate libary makes the library about 4 lines long and is just annoying. Putting it in the individual application(s) is exactly what libraries were designed to avoid. Is there a solution? Thanks Neil ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Obscure instances for Obscure types
Taking a lesson from relational databases, I'd put it in 5-normal form: a separate module importing its two dependencies. Don't forget the 2nd law of thermodynamics: no 4-line file will stay 4 lines long after repeated code iterations. You might as well plan for the inevitable. If it's too annoying to wait for that inevitability, try commenting the hell out of it until it has a respectable number of lines. Dan Neil Mitchell wrote: Hi I currently maintain two libraries, TagSoup which defines the Tag data type, and BinaryDefer, which defines the BinaryDefer class. If I wanted to include an instance for BinaryDefer Tag, where would I put it? Putting it in either library introduces an artificial dependency on the other. Putting it in a separate libary makes the library about 4 lines long and is just annoying. Putting it in the individual application(s) is exactly what libraries were designed to avoid. Is there a solution? Thanks Neil ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Obscure instances for Obscure types
Hi Dan, Don't forget the 2nd law of thermodynamics: no 4-line file will stay 4 lines long after repeated code iterations. You might as well plan for the inevitable. If this library is for the extra interactions available when using a libary with 2 classes (thats all BinaryDefer is likely to ever have) and 1 data structure (thats all TagSoup is likely to ever have) I get 2 possible instances - and not a lot of scope for growth. If it's too annoying to wait for that inevitability, try commenting the hell out of it until it has a respectable number of lines. Comments are for people who can't sense what their code does from the indentation :-) That and Haddock doesn't let you comment instances in any way that shows up, so all my beautiful comments would be lost. Thanks Neil Dan Neil Mitchell wrote: > Hi > > I currently maintain two libraries, TagSoup which defines the Tag data > type, and BinaryDefer, which defines the BinaryDefer class. If I > wanted to include an instance for BinaryDefer Tag, where would I put > it? > > Putting it in either library introduces an artificial dependency on > the other. Putting it in a separate libary makes the library about 4 > lines long and is just annoying. Putting it in the individual > application(s) is exactly what libraries were designed to avoid. > > Is there a solution? > > Thanks > > Neil > ___ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Obscure instances for Obscure types
On Fri, 27 Apr 2007 00:40:33 +0100 "Neil Mitchell" <[EMAIL PROTECTED]> wrote: > > If it's too annoying to wait for that inevitability, try commenting > > the hell out of it until it has a respectable number of lines. > > Comments are for people who can't sense what their code does from the > indentation :-) A bit of an exaggeration. I've written points-free code that *needs* comments in order for *me* to understand it six months later. ;) > That and Haddock doesn't let you comment instances in > any way that shows up, so all my beautiful comments would be lost. Yes, but you can still comment the module that contains them, which does show up, and manually list the instances. Since the number of instances is so small, this isn't hard. -- Robin ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] New HaskODell user groups
I've created a new wiki page documenting all the new user groups for Haskell that are springing up! http://haskell.org/haskellwiki/User_groups If you're starting a new group, please add it here, and publicise. -- Don P.S. Some obvious user group candidates, in my opinion, would be a Portland group, a Bay Area group and something at Chalmers... ;-) ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Haskell Weekly News: April 27, 2007
--- Haskell Weekly News http://sequence.complete.org/hwn/20070427 Issue 61 - April 27, 2007 --- Welcome to issue 61 of HWN, a weekly newsletter covering developments in the [1]Haskell community. The last week was a very exciting week for the Haskell community, with a new GHC release, the first release of Xmonad, a window manager written in Haskell, and DisTract, a new distributed bug tracker, written in Haskell. A number of new Haskell jobs were announced, and several new user groups were formed! 1. http://haskell.org/ Announcements GHC 6.6.1. Ian Lynagh [2]announced a new patchlevel release of GHC. This release contains a significant number of bugfixes relative to 6.6, so we recommend upgrading. Release notes are [3]here. GHC is a state-of-the-art programming suite for Haskell. Included is an optimising compiler generating good code for a variety of platforms, together with an interactive system for convenient, quick development. The distribution includes space and time profiling facilities, a large collection of libraries, and support for various language extensions, including concurrency, exceptions, and foreign language interfaces. 2. http://article.gmane.org/gmane.comp.lang.haskell.glasgow.user/12075 3. http://haskell.org/ghc/docs/6.6.1/html/users_guide/release-6-6-1.html Xmonad 0.1. Spencer Janssen [4]announced the inaugural release of [5]Xmonad. Xmonad is a minimalist tiling window manager for X, written in Haskell. Windows are managed using automatic layout algorithms, which can be dynamically reconfigured. At any time windows are arranged so as to maximise the use of screen real estate. All features of the window manager are accessible purely from the keyboard: a mouse is entirely optional. Xmonad is configured in Haskell, and custom layout algorithms may be implemented by the user in config files. 4. http://article.gmane.org/gmane.comp.lang.haskell.general/15131 5. http://xmonad.org/ DisTract: Distributed Bug Tracker implemented in Haskell. Matthew Sackman [6]announced DisTract, a [7]Distributed Bug Tracker. We're all now familiar with working with distributed software control systems, such as Monotone, Git, Darcs, Mercurial and others, but bug trackers still seem to be fully stuck in the centralised model: Bugzilla and Trac both have single centralised servers. This is clearly wrong, as if you're able to work on the Train, off the network and still perform local commits of code then surely you should also be able to locally close bugs too. DisTract allows you to manage bugs in a distributed manner through your web-browser. The distribution is achieved by making use of a distributed software control system, Monotone. Thus Monotone is used to move files across the network, perform merging operations and track the development of every bug. Finally, the glue in the middle that generates the HTML summaries and modifies the bugs is written in Haskell. 6. http://article.gmane.org/gmane.comp.lang.haskell.cafe/21857 7. http://www.distract.wellquite.org/ IOSpec 0.1. Wouter Swierstra [8]announced the first release of the [9]Test.IOSpec library, that provides a pure specification of some functions in the IO monad. This may be of interest to anyone who wants to debug, reason about, analyse, or test impure code. Essentially, by importing libraries from IOSpec you can the same code you would normally write in the IO monad. Once you're satisfied that your functions are reasonably well-behaved, you can remove the Test.IOSpec import and replace it with the 'real' functions instead. 8. http://article.gmane.org/gmane.comp.lang.haskell.general/15134 9. http://www.cs.nott.ac.uk/~wss/repos/IOSpec wl-pprint-1.0: Wadler/Leijen pretty printer. Stefan O'Rear [10]announced wl-pprint-1.0, the classic Wadler / Leijen pretty printing combinators, now in 100% easier to use [11]Cabalised form! PPrint is an implementation of the pretty printing combinators described by Philip Wadler (1997). In their bare essence, the combinators of Wadler are not expressive enough to describe some commonly occurring layouts. The PPrint library adds new primitives to describe these layouts and works well in practice. 10. http://thread.gmane.org/gmane.comp.lang.haskell.general/15112 11. http://hackage.haskell.org/cgi-bin/hackage-scripts/package/wl-pprint-1.0 London Haskell User Group. Neil Bartlett [12]announced the first meeting of the [13]London Haskell User Group on Wednesday 23rd May from 6:30PM. The meeting will be held at City University's main campus in central London, and Simon Peyton Jones will be coming to give a talk. 12. http://article.gmane.org/gmane.comp.lang.haskell.