Re: [Haskell-cafe] Sparks created, but not used (par/pseq, ST monad)
Hello Daniel, and running with ./st +RTS -N -s You'd need to give a number of capacities, I think (-N2 e.g.). The runtime option -N chooses the maximum number of cores, according to GHC's documentation. I think with the strict ST monad, when you have a - f n1 b - f n2 they are already evaluated, so there's no point in sparking evaluation in parallel. Very good point and probably the reason for my problems, thanks! Cheers, Michael -- Dipl.-Inf. Michael C. Lesniak University of Kassel Programming Languages / Methodologies Research Group Department of Computer Science and Electrical Engineering Wilhelmshöher Allee 73 34121 Kassel Phone: +49-(0)561-804-6269 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] safe lazy IO or Iteratee?
On Thu, 4 Feb 2010 12:51:59 -0800, John Millikin jmilli...@gmail.com wrote: Both have advantages and disadvantages. The primary advantage of lazy IO over iteratees is that it's much, *much* easier to understand -- existing experience with monads can be used immediately. The downsides of lazy IO, of course, are well documented[1][2][3]. Some are fixed by the safe/strict IO packages. However, safe lazy IO is still unpredictable in that it's difficult to know how many resources will be used, the order of some operations (eg, releasing handles), or whether some particular expression will throw an exception. I don't know if you include safe-lazy-io [1] here but its purpose is to cure these downsides. In particular file handles are properly released on time even when asking for a stream of a list of files. Moreover exceptions are not hidden and can be caught properly in the wrapping IO layer. Some restrictions are there though. For instance one cannot arbitrarily interleave different streams, one have to use one of the predefined interleaving scheme. Another limitation is that the client cannot react to errors without getting back to the non-lazy IO world, however this is a big selling point as well of lazy-IO: reuse pure code. I don't want to claim that (safe-)lazy-IO should be used in all situations, this would be terribly wrong. However I recommend it for situations were the interleaving of input is standard and errors have not to be caught in the processing code. Best regards, [1]: http://www.haskell.org/pipermail/haskell/2009-March/021133.html -- Nicolas Pouillard http://nicolaspouillard.fr ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Dutch HUG: meeting Monday 8th in Utrecht
I'd like to invite functional programmers in The Netherlands to the Dutch Haskell User Group [1, 2] meeting next Monday at 19:00. Two talks are scheduled: - Sebastiaan Visser and Tom Lokhorst will give a talk entitled AwesomePrelude, Liberating Haskell from data types! - Martijn van Steenbergen will talk about serializing monadic computations. In particular, he will describe a monadic EDSL to describe compass-and-straightedge constructions and how to serialize and deserialize such values. The meeting will be in the Booth Hall [3] of the Utrecht University Library. There's free car parking [4] at the library, and it's easily accessible by bike and bus [5]. After the talks we will move to The Basket [6] for drinks. See you next Monday! - Tom Lokhorst [1]: http://www.haskell.org/haskellwiki/Dutch_HUG [2]: http://groups.google.com/group/dutch-hug [3]: http://www.uu.nl/EN/library/contact/university_library/zaalverhuur/Pages/default.aspx#booth [4]: http://www.uu.nl/EN/library/contact/university_library/Parkeren/Pages/default.aspx [5]: http://www.uu.nl/EN/library/contact/university_library/plattegrondenrou/Pages/default.aspx [6]: http://utrecht.thebasket.nl/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: sendfile leaking descriptors on Linux?
Jeremy Shaw wrote: Actually, We should start by testing if native sendfile leaks file descriptors even when the whole file is sent. We have a test suite, but I am not sure if it tests for file handle leaking... I should have posted this earlier, but the exact message I'm seeing in the case where the Bad Client disconnects is this: hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) Oddly, I haven't been able to reproduce this using a wget client with a ^C during transfer. When I disconnect wget with ^C or pkill wget or even pkill -9 wget, I get this message: hums: Network.Socket.SendFile.Linux: resource vanished (Connection reset by peer) (and no leak, as observed by lsof | grep hums). So there appears to be some vital difference between the handling of the two cases. Another observation which may be useful: Before the sendfile' API change (Handle - FilePath) in sendfile-0.6.x, my code used withFile to open the file and to ensure that it was closed. So it seems that withBinaryFile *should* also be fine. Unless the Broken pipe error somehow escapes the scope without causing a close. I don't have time to dig more right now, but I'll try to see if I can find out more later. Cheers, ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: programmatic DB interface?
and then read with my own parse string:%Y-%m-%d %T%Q This seems to work just fine. Thanks. - When I'm using that format string, I get: Convertible: error converting source data SqlLocalTime 2008-10-29 00:00:00 of type SqlValue to type Data.Time.LocalTime.LocalTime.ZonedTime: incompatible types I guess I need to find out who wants ZonedTime. In my DB description (generated by dbdirect), the only time-related type is CalendarTime. J. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
RE: [Haskell-cafe] Anyone up for Google SoC 2010?
Gwern Branwen wrote: On Wed, Feb 3, 2010 at 8:14 PM, Henk-Jan van Tuyl hjgt...@chello.nl wrote: On Wed, 03 Feb 2010 23:34:34 +0100, Neil Mitchell ndmitch...@gmail.com wrote: Hi Gwern, Please update: haskell-src-exts - haskell-src **Unknown** This project was an unqualified success. haskell-src-exts is now one of the most commonly used Haskell libraries, achieved the goals in the project proposal, and is an essential piece of Haskell infrastructure. You can see this using Roel van Dijk's reversed dependencies overview [1]: 23 direct and 57 indirect dependencies on haskell-src-exts-1.8.0 Regards, Henk-Jan van Tuyl And how many of those used haskell-src-exts *before* the SoC project? And would have used it regardless? You can't point to a popular project which got a SoC student, and say look at how popular it is - obviously the SoC student was hugely successful. Regardless of that, is there any reason to disregard Neil's summary and not update your page? Ganesh === Please access the attached hyperlink for an important electronic communications disclaimer: http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html === ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: sendfile leaking descriptors on Linux?
I've been seeing a steady stream of similar resource vanished messages for as long as I've been running my happstack app. This message I get is this: socket: 58: hClose: resource vanished (Broken pipe) I run my app from a shell script inside a while true loop, so it automatically gets restarted if it crashes. This incurs no more than a few seconds of down time. Since that is acceptable for my application, I've never put much effort into investigating the issue. But I don't think the resource vanished error results in program termination. When I have looked into it, I've had similar trouble reproducing it. Clients such as wget and firefox don't seem to cause the problem. If I remember correctly it only happens with IE. On Fri, Feb 5, 2010 at 2:56 AM, Bardur Arantsson s...@scientician.net wrote: Jeremy Shaw wrote: Actually, We should start by testing if native sendfile leaks file descriptors even when the whole file is sent. We have a test suite, but I am not sure if it tests for file handle leaking... I should have posted this earlier, but the exact message I'm seeing in the case where the Bad Client disconnects is this: hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) Oddly, I haven't been able to reproduce this using a wget client with a ^C during transfer. When I disconnect wget with ^C or pkill wget or even pkill -9 wget, I get this message: hums: Network.Socket.SendFile.Linux: resource vanished (Connection reset by peer) (and no leak, as observed by lsof | grep hums). So there appears to be some vital difference between the handling of the two cases. Another observation which may be useful: Before the sendfile' API change (Handle - FilePath) in sendfile-0.6.x, my code used withFile to open the file and to ensure that it was closed. So it seems that withBinaryFile *should* also be fine. Unless the Broken pipe error somehow escapes the scope without causing a close. I don't have time to dig more right now, but I'll try to see if I can find out more later. Cheers, ___ 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] Re: programmatic DB interface?
On Fri, Feb 5, 2010 at 10:55 AM, Johannes Waldmann waldm...@imn.htwk-leipzig.de wrote: and then read with my own parse string:%Y-%m-%d %T%Q This seems to work just fine. Thanks. - When I'm using that format string, I get: Convertible: error converting source data SqlLocalTime 2008-10-29 00:00:00 of type SqlValue to type Data.Time.LocalTime.LocalTime.ZonedTime: incompatible types I guess I need to find out who wants ZonedTime. In my DB description (generated by dbdirect), the only time-related type is CalendarTime. J. Did you append an empty string in the SELECT statement? If you append the empty string (||''), HDBC treats the field as text and so returns a SqlByteString. However, if you do not append the empty string, it treats the field as a timestamp and tries to convert it before it even reaches your code. All of this is just speculation, of course, since I haven't actually looked at the code. But my extensive (ie, 5 minute) testing implies it to be true. Michael ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Generating repeatable arbitrary values with QuickCheck 2
Ryan Ingram wrote: Unfortunately, this makes things like infinite_xs - sequence (repeat arbitrary) no longer work, since the state never comes out the other side. You're asking to execute an infinite number of monadic actions. How can this ever terminate at all? Martijn. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] online Real World Haskell - tool used?
Not a Haskell question, pardon me. I believe the online Real World Haskell book with commenting system was generated with an open-source tool (written by one of the authors?). Any idea where I might find this? [I think I had gotten the link long ago, lost it]. I am also curious what authoring tools were used to write the book. Thanks! Sophie ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Generating repeatable arbitrary values with QuickCheck 2
Martijn, Ryan wrote: Unfortunately, this makes things like infinite_xs - sequence (repeat arbitrary) no longer work, since the state never comes out the other side. You replied: You're asking to execute an infinite number of monadic actions. How can this ever terminate at all? There is this thing called lazy evaluation, you know. ;-) Try for yourself: import System.Random import Test.QuickCheck foo :: Gen [Int] foo = do ns - sequence (repeat arbitrary) return (take 5 ns) main :: IO () main = do stdGen - newStdGen print (generate 42 stdGen foo) Cheers, Stefan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] multMM :: Matrix - Matrix - Matrix --multiplies two matrices question (Homework)
I did a blog post on basic matrix ops which may be useful to you http://blog.keithsheppard.name/2009/06/bird-tracks-through-math-land-basic.html It uses a 2D list representation for matrices which you would not do for any performance critical work. best keith On Wed, Feb 3, 2010 at 1:38 AM, 조광래 kwangrae...@gmail.com wrote: hi i was trying to solve it but All i got is type Matrix=[[Double]] multMM :: Matrix - Matrix - Matrix --multiplies two matrices multMM m t = [[sum (zipWith (*) (head m)(a)) ] ]where a = [head a | a- t] Main multMM [[2,1,-6],[1,-3,2]] [[1,0,-3],[0,4,20],[-2,1,1]] [[14.0]] from this i could get only the first multiplication 14 that is by 2*1 + 1*0 + -6*-2 = 14 how can i make this go throw all rows and colums to get multiple of matrixs? Thank you~ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe -- keithsheppard.name ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: programmatic DB interface?
Michael Snoyman michael at snoyman.com writes: Did you append an empty string in the SELECT statement? I did not write a SELECT statement (see first post of this thread) ... SELECTs are generated by haskelldb(-hdbc-postgresql) I have a working version now, but only by 1. changing the format string computation to %Y-%m-%d ++ ' ' : fmt 2. adding a line in instance Convertible SqlValue ZonedTime for safeConvert y@(SqlLocalTime x) Magnus says 1. is wrong, but I don't see how the DB server could be convinced to send the ...T...Z format. In my application, the table definition contains 'timestamp without time zone' and I cannot change that. J. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: programmatic DB interface?
Johannes == Johannes Waldmann waldm...@imn.htwk-leipzig.de writes: Johannes Michael Snoyman michael at snoyman.com writes: Did you append an empty string in the SELECT statement? Johannes Magnus says 1. is wrong, but I don't see how the DB server Johannes could be convinced to send the ...T...Z format. In my Johannes application, the table definition contains 'timestamp Johannes without time zone' and I cannot change that. That is exactly the problem - it is wrong for CalendarT. -- Colin Adams Preston Lancashire ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: programmatic DB interface?
That is exactly the problem - it is wrong for CalendarT. what do you mean by it ... what package should be fixed (old-locale, haskelldb-hdbc-postgreqsl, ...)? Because obviously something seems broken here. J. signature.asc Description: OpenPGP digital signature ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] cabal fun (not)
while trying to live with different versions of packages, I found cabal-install's behaviour strange because: you can cabal install a package without any complaint but the next ghc-pkg list is all red because of conflicts. and it's too late then - there's no way to get back. even if you re-install some package, it seems it is getting a different hashcode, so it's not recognized. if you were doing cabal install --global for some ghc package (e.g. old-locale), then ghc seems completely hosed and you've got to re-install the compiler. well that's not a big deal by itself but afterwards you have to re-install all packages ... so please please please have cabal install fail with some error message if (that is, before) the install would break anything. - J. $ ghc --version The Glorious Glasgow Haskell Compilation System, version 6.12.1 $ cabal --version cabal-install version 0.8.0 using version 1.8.0.2 of the Cabal library signature.asc Description: OpenPGP digital signature ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: programmatic DB interface?
Johannes == Johannes Waldmann waldm...@imn.htwk-leipzig.de writes: That is exactly the problem - it is wrong for CalendarT. Johannes what do you mean by it ... what package should be fixed Johannes (old-locale, haskelldb-hdbc-postgreqsl, ...)? Because Johannes obviously something seems broken here. It is the use of unzoned times. I sent the following patch to the haskelldb list several months ago. But there has not been a new release since then. Colin It is just the code to generate the SQL for CREATE TABLE is Colin presumably faulty. For CalendarTimeT columns it should Colin generate a time of Colin timestamp with time zone Colin as CalendarTime is a zoned timestamp. here's my patch: --- Default.hs~ 2009-02-13 23:06:25.0 + +++ Default.hs 2009-10-01 16:43:34.0 +0100 @@ -92,7 +92,7 @@ IntegerT - SqlType bigint DoubleT - SqlType double precision BoolT - SqlType bit - CalendarTimeT - SqlType timestamp + CalendarTimeT - SqlType timestamp with time zone BStrT a - SqlType1 varchar a -- Colin Adams Preston Lancashire ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: programmatic DB interface?
Colin Paul Adams wrote: Colin It is just the code to generate the SQL for CREATE TABLE is Colin presumably faulty. well this wouldn't help in my case since I did not CREATE TABLE from haskelldb. In my application, the DB is given externally, and I used Database.HaskellDB.DBDirect to create the Haskell interface. J. signature.asc Description: OpenPGP digital signature ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] safe lazy IO or Iteratee?
I didn't count the commented-out designs in Oleg's code, only those which are live. Both designs appear to offer similar performance in aggregate, although there are differences for particular functions. I haven't yet had a chance to test the performance of the CPS variant, although Oleg has indicated he expects it will be higher. I wrote some criterion benchmarks for IterateeM vs IterateeCPS, and the CPS version was notably slower. I don't understand enough about CPS to diagnose why, but the additional runtime was present in even simple cases (reading from a file, writing back out). On Fri, Feb 5, 2010 at 06:04, John Lato jwl...@gmail.com wrote: Subject: Re: [Haskell-cafe] safe lazy IO or Iteratee? Downside: iteratees are very hard to understand. I wrote a decently-sized article about them trying to figure out how to make them useful, and some comments in one of Oleg's implementations suggest that the iteratee package is subtly wrong. Oleg has written at least three versions (non-monadic, monadic, monadic CPS) and I've no idea why or whether their differences are important. Even dons says he didn't understand them until after writing his own iteratee-based IO layer. More significant than, and orthogonal to, the differences between non-monadic and monadic are the two primary implementations Oleg has written. They are[1]: Design 1: newtype Iteratee el m a = Iteratee{runIter:: Stream el - m (IterV el m a)} data IterV el m a = IE_done a (Stream el) | IE_cont (Iteratee el m a) (Maybe ErrMsg) Design 2: newtype Iteratee el m a = Iteratee{runIter:: m (IterV el m a)} data IterV el m a = IE_done a (Stream el) | IE_cont (Stream el - Iteratee el m a) (Maybe ErrMsg With the first design, it's impossible to get the state of an iteratee without feeding it a chunk. There are other consequences too. The second design seems to require some specialized combinators, that is (==) and ($$), which are not required for the first version. Neither situation is ideal. The CPS version appears to remedy both flaws, but at the expense of introducing CPS at a low level (this can be hidden from the end user in many cases). I already think of iteratees as holding continuations, so to me the so-called CPS version is to me a double CPS. Both designs appear to offer similar performance in aggregate, although there are differences for particular functions. I haven't yet had a chance to test the performance of the CPS variant, although Oleg has indicated he expects it will be higher. The monadic/non-monadic issue is related. Non-monadic iteratees are iteratees that can't perform monadic effects when they're running (although they can still be fed from a monadic enumerator). Essentially it's the difference between fold and foldM. They are simpler and more efficient because of this, but also much less powerful. Any iteratee design can support both non-monadic and monadic, but *I* don't want to support both. At least, I don't want to have double modules for everything for nearly identical functions, and polymorphic code that can handle non-monadic and monadic iteratees is non-trivial[2]. Much of my recent work has been in the consequences of these various design considerations for the next version of the iteratee library. Currently undecided, although I'm leaning towards CPS. It seems to solve a lot of problems, and the implementation details are generally cleaner too. Cheers, John [1] Both taken from http://okmij.org/ftp/Haskell/Iteratee/IterateeM.hs. Design 1 is commented out on that page. [2] At least for me. Maybe others can provide a better solution. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack ADT?
You could also implement stacks with mutable data structures, e.g. STArray, etc. What do you want to use a stack ADT for? Usually stacks are discussed for pedagogical purposes but usually recursion is used if you need a stack like operation. -- Regards, Casey ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack ADT?
Casey == Casey Hawthorne cas...@istar.ca writes: Casey You could also implement stacks with mutable data structures, Casey e.g. STArray, etc. Casey What do you want to use a stack ADT for? BTW, There is a Myers stack in Edison. Disclaimer - I don't know what a Myers stack is. -- Colin Adams Preston Lancashire ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack ADT?
Not using Stack for anything, just trying to understand how things can be done in Haskell. To that end... What's going on here? I'm not even calling function POP. Michael == module Data.Stack (Stack, emptyStack, isEmptyStack, push, pop, top) where newtype Stack a = Stack [a] emptyStack = Stack [] isEmptyStack (Stack xs) = null xs push x (Stack xs) = Stack (x:xs) pop (Stack (_:xs)) = Stack xs top (Stack (x:_)) = x == [mich...@localhost ~]$ ghci Stack.hs GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling Data.Stack ( Stack.hs, interpreted ) Ok, modules loaded: Data.Stack. *Data.Stack let s1 = emptyStack *Data.Stack top (push 1 s1) 1 *Data.Stack top (push 2 s1) 2 *Data.Stack top (push 3 s1) 3 *Data.Stack let s2 = pop s1 *Data.Stack top s2 *** Exception: Stack.hs:8:0-28: Non-exhaustive patterns in function pop *Data.Stack --- On Fri, 2/5/10, Casey Hawthorne cas...@istar.ca wrote: From: Casey Hawthorne cas...@istar.ca Subject: Re: [Haskell-cafe] Stack ADT? To: haskell-cafe@haskell.org Date: Friday, February 5, 2010, 10:36 AM You could also implement stacks with mutable data structures, e.g. STArray, etc. What do you want to use a stack ADT for? Usually stacks are discussed for pedagogical purposes but usually recursion is used if you need a stack like operation. -- Regards, Casey ___ 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] Stack ADT?
What's going on is that data structures in Haskell are immutable. Thus, when you call push on a stack, you get a new stack with the new element pushed onto it, and the original stack is left un-touched. On Fri, Feb 5, 2010 at 10:56 AM, michael rice nowg...@yahoo.com wrote: Not using Stack for anything, just trying to understand how things can be done in Haskell. To that end... What's going on here? I'm not even calling function POP. Michael == module Data.Stack (Stack, emptyStack, isEmptyStack, push, pop, top) where newtype Stack a = Stack [a] emptyStack = Stack [] isEmptyStack (Stack xs) = null xs push x (Stack xs) = Stack (x:xs) pop (Stack (_:xs)) = Stack xs top (Stack (x:_)) = x == [mich...@localhost ~]$ ghci Stack.hs GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling Data.Stack ( Stack.hs, interpreted ) Ok, modules loaded: Data.Stack. *Data.Stack let s1 = emptyStack *Data.Stack top (push 1 s1) 1 *Data.Stack top (push 2 s1) 2 *Data.Stack top (push 3 s1) 3 *Data.Stack let s2 = pop s1 *Data.Stack top s2 *** Exception: Stack.hs:8:0-28: Non-exhaustive patterns in function pop *Data.Stack --- On *Fri, 2/5/10, Casey Hawthorne cas...@istar.ca* wrote: From: Casey Hawthorne cas...@istar.ca Subject: Re: [Haskell-cafe] Stack ADT? To: haskell-cafe@haskell.org Date: Friday, February 5, 2010, 10:36 AM You could also implement stacks with mutable data structures, e.g. STArray, etc. What do you want to use a stack ADT for? Usually stacks are discussed for pedagogical purposes but usually recursion is used if you need a stack like operation. -- Regards, Casey ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://mc/compose?to=haskell-c...@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 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack ADT?
What's going on here? I'm not even calling function POP. *Data.Stack let s2 = pop s1 *Data.Stack top s2 *** Exception: Stack.hs:8:0-28: Non-exhaustive patterns in function pop Haskell being a non strict language, does not evaluate pop s1 when you define let s2 = pop s1. but when you try to use s2 by evaluating top s2 pop s1 needs to be evaluated leading to the error in pop, since the definition of pop, does not deal with the case when the Stack is empty (Stack []). pop (Stack (_:xs)) = Stack xs top (Stack (x:_)) = x ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack ADT?
2010/2/5 michael rice nowg...@yahoo.com Not using Stack for anything, just trying to understand how things can be done in Haskell. To that end... What's going on here? I'm not even calling function POP. Michael == module Data.Stack (Stack, emptyStack, isEmptyStack, push, pop, top) where newtype Stack a = Stack [a] emptyStack = Stack [] isEmptyStack (Stack xs) = null xs push x (Stack xs) = Stack (x:xs) pop (Stack (_:xs)) = Stack xs top (Stack (x:_)) = x == [mich...@localhost ~]$ ghci Stack.hs GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling Data.Stack ( Stack.hs, interpreted ) Ok, modules loaded: Data.Stack. *Data.Stack let s1 = emptyStack *Data.Stack top (push 1 s1) 1 *Data.Stack top (push 2 s1) 2 *Data.Stack top (push 3 s1) 3 *Data.Stack let s2 = pop s1 *Data.Stack top s2 *** Exception: Stack.hs:8:0-28: Non-exhaustive patterns in function pop When you write push 1 s1 you get a new stack value. you can view it by typing 'it' in ghci (provided you have an instance of Show for it). s1 is still s1, the empty stack. When you write let s2 = pop s1 Nothing happens yet, but if you want to evaluate s2, e.g. by typing it in ghci, pop will be applied to the empty stack, which is not taken care of in its definition. And you do want evaluate s2 when you eventually write top s2. HTH, Thu ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] safe lazy IO or Iteratee?
John Lato jwl...@gmail.com wrote: Both designs appear to offer similar performance in aggregate, although there are differences for particular functions. I haven't yet had a chance to test the performance of the CPS variant, although Oleg has indicated he expects it will be higher. @jwlato: Do you mind creating `IterateeCPS' tree in http://inmachina.net/~jwlato/haskell/iteratee/src/Data/, so we can start writing CPS performance testing code? AFAICS, you have benchmarks for IterateeM-driven code already: http://inmachina.net/~jwlato/haskell/iteratee/tests/benchmarks.hs John Millikin jmilli...@gmail.com wrote: I wrote some criterion benchmarks for IterateeM vs IterateeCPS, and the CPS version was notably slower. I don't understand enough about CPS to diagnose why, but the additional runtime was present in even simple cases (reading from a file, writing back out). @jmillikin: Could you please publish those benchmarks? Thanks. -- vvv ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Stack ADT?
I see now that what I thought was happening wasn't happening at all. top (push 1 s1) gives me the top of the new Stack returned by PUSH. s1 remains unchanged. Thanks, Michael --- On Fri, 2/5/10, minh thu not...@gmail.com wrote: From: minh thu not...@gmail.com Subject: Re: [Haskell-cafe] Stack ADT? To: michael rice nowg...@yahoo.com Cc: haskell-cafe@haskell.org, Casey Hawthorne cas...@istar.ca Date: Friday, February 5, 2010, 11:04 AM 2010/2/5 michael rice nowg...@yahoo.com Not using Stack for anything, just trying to understand how things can be done in Haskell. To that end... What's going on here? I'm not even calling function POP. Michael == module Data.Stack (Stack, emptyStack, isEmptyStack, push, pop, top) where newtype Stack a = Stack [a] emptyStack = Stack [] isEmptyStack (Stack xs) = null xs push x (Stack xs) = Stack (x:xs) pop (Stack (_:xs)) = Stack xs top (Stack (x:_)) = x == [mich...@localhost ~]$ ghci Stack.hs GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling Data.Stack ( Stack.hs, interpreted ) Ok, modules loaded: Data.Stack. *Data.Stack let s1 = emptyStack *Data.Stack top (push 1 s1) 1 *Data.Stack top (push 2 s1) 2 *Data.Stack top (push 3 s1) 3 *Data.Stack let s2 = pop s1 *Data.Stack top s2 *** Exception: Stack.hs:8:0-28: Non-exhaustive patterns in function pop When you write push 1 s1 you get a new stack value. you can view it by typing 'it' in ghci (provided you have an instance of Show for it). s1 is still s1, the empty stack. When you write let s2 = pop s1 Nothing happens yet, but if you want to evaluate s2, e.g. by typing it in ghci, pop will be applied to the empty stack, which is not taken care of in its definition. And you do want evaluate s2 when you eventually write top s2. HTH, Thu ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] safe lazy IO or Iteratee?
On Fri, Feb 5, 2010 at 4:31 PM, Valery V. Vorotyntsev valery...@gmail.com wrote: John Lato jwl...@gmail.com wrote: Both designs appear to offer similar performance in aggregate, although there are differences for particular functions. I haven't yet had a chance to test the performance of the CPS variant, although Oleg has indicated he expects it will be higher. @jwlato: Do you mind creating `IterateeCPS' tree in http://inmachina.net/~jwlato/haskell/iteratee/src/Data/, so we can start writing CPS performance testing code? I'm working on the CPS version and will make it public when it's done. It may take a week or so; this term started at 90 and has picked up. I have several benchmark sources that aren't public yet, but I can put them online for your perusal. AFAICS, you have benchmarks for IterateeM-driven code already: http://inmachina.net/~jwlato/haskell/iteratee/tests/benchmarks.hs Those will make more sense when I've added the context of the codebases in use. There are several more sets of output that I simply haven't published yet, including bytestring-based variants. John Millikin jmilli...@gmail.com wrote: I wrote some criterion benchmarks for IterateeM vs IterateeCPS, and the CPS version was notably slower. I don't understand enough about CPS to diagnose why, but the additional runtime was present in even simple cases (reading from a file, writing back out). That's very interesting. I wonder if I'll see the same, and if I'd be able to figure it out myself... Did you benchmark any cases without doing IO? Sometimes the cost of the IO can overwhelm any other measurable differences, and also disk caching can affect results. Criterion should highlight any major outliers, but I still like to avoid IO when benchmarking unless strictly necessary. @jmillikin: Could you please publish those benchmarks? +1 John ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: sendfile leaking descriptors on Linux?
Thomas Hartman wrote: Do you have a test script to reproduce the behavior? Unfortunately not, but the behavior *is* 100% reproducible with my PS3 client. The production of a leaked FD appears to require a particularly abrupt disconnect (see my other reply in this thread), so you're probably safe in most cases. Cheers, ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: could we get a Data instance for Data.Text.Text?
Hello, I have attached a new version that should work with GHC 6.10, though I have not tested it. The older Data.Data uses mkNorepType instead of mkNoRepType. I just changed the patch to use the older spelling. In GHC = 6.12 this will issue a warning that the old spelling has been deprecated. This seems like a reasonable fix as long as text drops support for GHC 6.10 before mkNorepType is completely removed from Data.Data (which may never happen?): Here is the bug: http://hackage.haskell.org/trac/ghc/ticket/2760 Also, this patch still won't work with GHC 6.10, is that ok? I also noticed in the containers package, there are #ifdefs around the Data instances: #if __GLASGOW_HASKELL__ ... #endif Should I add that as well? Or is text only supported under GHC anyway? - jeremy On Tue, Feb 2, 2010 at 12:03 AM, Bryan O'Sullivan b...@serpentine.comwrote: On Mon, Feb 1, 2010 at 12:08 PM, Jeremy Shaw jer...@n-heptane.com wrote: Attached. Data/Text.hs:175:63: Module `Data.Data' does not export `mkNoRepType' Can you send a followup patch that works against GHC 6.10.4, please? data-instance-for-text-2.dpatch Description: Binary data ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] a beginner question: decorate-op-undecorate
Hi Haskell-Cafe, Consider a data type such as data Binding = Binding Var (Either Value [Value]) representing a variable bound either to a fixed value or that has a list of possible values. I'd like to perform an operation on say, the fixed-value members of a list of bindings. Data.Either has partitionEithers---I'd essentially like to use partitionEithers, but in a way that it peeks into the value field of the binding. For the sake of argument, let's say I can't or can't modify Binding to move the Either to the outside. What would be an idiomatic Haskell way to accomplish this? Currently I've got liftedPartitionEithers :: [a] - (a - Either b c) - ([a], [a]) which is my own version of partitionEithers that calls a selector first. Another option would be to map each Binding to a new datatype that has the Either on the outside, use partitionEithers, and map back. Thanks, Aran ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Anyone up for Google SoC 2010?
On Fri, Feb 5, 2010 at 6:20 AM, Sittampalam, Ganesh ganesh.sittampa...@credit-suisse.com wrote: Gwern Branwen wrote: On Wed, Feb 3, 2010 at 8:14 PM, Henk-Jan van Tuyl hjgt...@chello.nl wrote: On Wed, 03 Feb 2010 23:34:34 +0100, Neil Mitchell ndmitch...@gmail.com wrote: Hi Gwern, Please update: haskell-src-exts - haskell-src **Unknown** This project was an unqualified success. haskell-src-exts is now one of the most commonly used Haskell libraries, achieved the goals in the project proposal, and is an essential piece of Haskell infrastructure. You can see this using Roel van Dijk's reversed dependencies overview [1]: 23 direct and 57 indirect dependencies on haskell-src-exts-1.8.0 Regards, Henk-Jan van Tuyl And how many of those used haskell-src-exts *before* the SoC project? And would have used it regardless? You can't point to a popular project which got a SoC student, and say look at how popular it is - obviously the SoC student was hugely successful. Regardless of that, is there any reason to disregard Neil's summary and not update your page? Ganesh I prefer to wait. haskell-src-exts was popular before, it was popular after. The question is not whether the patches were applied, or whether the mentor told Google it was successful, but whether it was the best possible use of the SoC slot. If features do not get used, then it wasn't a good SoC. If you know 3 or 4 uses of the new haskell-src-exts features in (relatively) major applications like hlint, then I'll concede the point and mark it a success. -- gwern ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] a beginner question: decorate-op-undecorate
On Fri, Feb 05, 2010 at 12:34:01PM -0500, Aran Donohue wrote: Hi Haskell-Cafe, Consider a data type such as data Binding = Binding Var (Either Value [Value]) representing a variable bound either to a fixed value or that has a list of possible values. I'd like to perform an operation on say, the fixed-value members of a list of bindings. Data.Either has partitionEithers---I'd essentially like to use partitionEithers, but in a way that it peeks into the value field of the binding. For the sake of argument, let's say I can't or can't modify Binding to move the Either to the outside. What would be an idiomatic Haskell way to accomplish this? Currently I've got liftedPartitionEithers :: [a] - (a - Either b c) - ([a], [a]) which is my own version of partitionEithers that calls a selector first. Another option would be to map each Binding to a new datatype that has the Either on the outside, use partitionEithers, and map back. Thanks, Aran ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe You could try using uniplate[1], something like transformBi (either doWhatYouLike id) I guess :). [1] http://hackage.haskell.org/package/uniplate -- Felipe. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Two GET HTTP requests
Hi everyone, I'm trying to do a number of successive HTTP requests in one program. Here's what I tried: Approach 1: I used the 'download' package, which failed to install on OS X. It fails with error: libio.h: No such file or directory. Approach 2: I installed the 'download-curl' package, and tried again. This seems to fail on the following example: import Network.Curl.Download main = do x - openURI http://haskell.org; y - openURI http://haskell.org/hoogle; return () If I put a print statement around the second line of the do-statement it looks like openURI never returns. Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following: simpleHTTP (getRequest http://haskell.org;) This failed with just the text Bus error. I searched the HTTPBis git repository, but couldn't find the text Bus error. I don't have a clue of how to fix this. I'm a bit stuck here, I would love to help fix the errors, but don't know what would be the best place to begin. If anyone can point me in the right direction, I will try to patch at least one of these packages. Thanks, -chris ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Trapping getChar before echo
Tim Attwood wrote: Last time I tried something like this [on Windows], it didn't seem to work. I wanted to trap arrow keys and so forth, but they seem to be being used for input history. (I.e., pressing the up-arrow produces previously-entered lines of text, and none of this appears to be reaching the Haskell program itself.) Has this changed since I tried it last year? Doesn't work in windows, at least up till 6.10.1. There's a work-around though. {-# LANGUAGE ForeignFunctionInterface #-} import Data.Char import Control.Monad (liftM, forever) import Foreign.C.Types getHiddenChar = liftM (chr.fromEnum) c_getch foreign import ccall unsafe conio.h getch c_getch :: IO CInt main = do forever $ do c - getHiddenChar putStrLn $ show (fromEnum c) Thanks for the info. Does anyone know how this is related to the haskeline package on Hackage? ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] GUI programming
Victor Nazarov wrote: Hello, I've been writing some GUI application with Gtk2hs. It's an interpreter for lambda-calculus and combinatory logic, it's GPL and if you interested I can share it with cafe. The problem is that the GUI code has become very ugly and I'm tempted to rewrite it totally. I've been looking forward to the FRP stuff, but I've never seen a single definition of the term. Conal Eliot's denotational programming is too general to be definition. I want to try Grapefruit, but I got totally lost when I see arrow notation. I consider more lightweight and more imperative approach, something closer to CSP (Communicating Secuential Processes) then FRP. I've just crafted some sample program to illustrate my idea. The behaviour is a monad and it's IO monad so you can do any IO (Gtk2hs) programming you wish. The differences is that you don't attach static event handlers and tries to determine what to do dependent on application state. You attach and detach handlers as much as possible. Behaviour looks like a process that can stop execution and wait for some GUI event. When event arrived it continues execution. To summarize, the behaviour is a suspendable IO computation. It looks very much like a coroutine, in fact. I'm planning to extract the Control.Concurrent.Coroutine module [1] into a separate package soon. It implements a similar concept but generalized to transform any monad and any functorial suspension. [1] http://hackage.haskell.org/packages/archive/scc/0.4/doc/html/Control-Concurrent-Coroutine.html Do you see this approach viable. There are steel some details to emerge: * How to wait for several events * How to handle IO exceptions I don't really know how applicable the idea is to GUI programming. That's not my area of expertise. I am surprised, though, that neither your code not your comments seem to address the issue of concurrency, as I expect that would be crucial in a GUI setting. Wouldn't you need different behaviours to run in different threads? Here is the code: {-# LANGUAGE ExistentialQuantification #-} ... I don't see the purpose of your BBind constructor. It seems to me that you could simply move the first three cases of runBehaviour implementation into your = and get rid of the constructor. Do you need that much laziness? import Data.IORef import System.Glib import Graphics.UI.Gtk import Control.Monad.Trans type Event obj = IO () - IO (ConnectId obj) data Behaviour a = forall b. BBind (Behaviour b) (b - Behaviour a) | BIO (IO a) | forall obj. GObjectClass obj = BWaitEvent (Event obj) (Behaviour a) instance Monad Behaviour where action = generator = BBind action generator return a = BIO (return a) instance MonadIO Behaviour where liftIO action = BIO action runBehaviour :: Behaviour a - IO a runBehaviour (BBind (BWaitEvent event after) f) = runBehaviour (BWaitEvent event (after = f)) runBehaviour (BBind (BIO a) f) = a = \x - runBehaviour (f x) runBehaviour (BBind (BBind a f) g) = runBehaviour (a = (\x - f x = g)) runBehaviour (BIO a) = a runBehaviour (BWaitEvent event after) = do sigIdRef - newIORef (error You can't access sigIdRef before signal is connected) sigId - event $ do sigId - readIORef sigIdRef signalDisconnect sigId runBehaviour after return () writeIORef sigIdRef sigId return (error You can't expect result from behaviour) waitEvent :: GObjectClass obj = Event obj - Behaviour () waitEvent event = BWaitEvent event (return ()) main :: IO () main = do initGUI window - windowNew onDestroy window mainQuit set window [windowTitle := Hello World] button - buttonNew let buttonB label = do liftIO $ set button [buttonLabel := label] waitEvent (onClicked button) buttonB (label ++ *) runBehaviour (buttonB *) set window [containerChild := button] widgetShowAll window mainGUI ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe -- Mario Blazevic mblaze...@stilo.com Stilo International This message, including any attachments, is for the sole use of the intended recipient(s) and may contain confidential and privileged information. Any unauthorized review, use, disclosure, copying, or distribution is strictly prohibited. If you are not the intended recipient(s) please contact the sender by reply email and destroy all copies of the original message and any attachments. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: sendfile leaking descriptors on Linux?
I desperation, I've tried to instrument a couple of the functions in SendFile: sendFile'' :: Socket - Handle - Integer - Integer - IO () sendFile'' outs inp off count = do let out_fd = Fd (fdSocket outs) in_fd - handleToFd inp putStrLn (in_fd= ++ show in_fd) finally (wrapSendFile' _sendFile out_fd in_fd off count) (do putStrLn (SENDFILE DONE ++ show in_fd) ) sendFile' :: Socket - FilePath - Integer - Integer - IO () sendFile' outs infp offset count = bracket (openBinaryFile infp ReadMode) (\h - do putStrLn CLOSING FILE! hClose h putStrLn FILE CLOSED!) (\inp - sendFile'' outs inp offset count) (Yes, this made me feel dirty.) Here's the resulting output from around when the file descriptor gets lost: --- Serving file 'X'... Sending 674465792 bytes... in_fd=7 SENDFILE DONE 7 CLOSING FILE! FILE CLOSED! hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) Got request for CONTENT for objectId=1700,f2150400 Serving file 'X'... Sending 672892928 bytes... in_fd=7 SENDFILE DONE 7 CLOSING FILE! FILE CLOSED! hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) Got request for CONTENT for objectId=1700,f2150400 Serving file 'X'... Sending 670140416 bytes... in_fd=7 *- What happened here? Got request for CONTENT for objectId=1700,f2150400 Serving file 'X'... Sending 667256832 bytes... in_fd=9 SENDFILE DONE 9 CLOSING FILE! FILE CLOSED! hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) Got request for CONTENT for objectId=1700,f2150400 Serving file 'X'... Sending 665028608 bytes... in_fd=9 SENDFILE DONE 9 CLOSING FILE! FILE CLOSED! hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) Got request for CONTENT for objectId=1700,f2150400 Serving file 'X'... --- Anyone got any clues as to what might cause the behavior show at the mark? The only idea I have is that *something* in the SendFile library kills the thread completely (or somehow evades finally), but I have no idea what it might be. Cheers, ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Simulation of interconnect network
I am building a simulator for an interconnect network for a multiprocessor computer. I would like to develop it in Haskell as an opportunity to learn Haskell. The network will have a number of routers with input ports and output ports and crossbars between them. I would like to simulate the protocol. This would be an event driven simulator. It would be at a high level, leaving out many details. I would like it to be fast and be able to run it on several processors. I would like to know if you have any advice. Has anyone done this before? Are there any discrete event simulators written in Haskell? R ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Anyone up for Google SoC 2010?
You can add me to the list of voices that were unwilling to use it before the summer-of-code project due to the random incompatibilities caused by the huge supply of extensions it supported out of the box, but who were happy to switch to it after the changes were made to make them configurable. That said, I don't support a major public application. But keep in mind haskell-src-exts is used by almost every quasiquoter that wants antiquotation, so the improvements in mere compatibility with Haskell 98 as a baseline have had fairly wide-reaching impact, affecting almost every one of those 23 (or 57 depending how you count) dependencies on the haskell-src-exts library. One might argue that that well exceeds your 3 or 4 feature user guideline. =) The rest is just gravy that happens to permit a number of applications such as refactoring browsers that were impossible with the previous implementation. And, as I recall, the fairly radical exploratory pretty print . parse = id goal was explicitly listed merely as a secondary goal on the original application. It seems hardly appropriate to judge the impact of the entire SoC effort on the impact of that secondary exploratory component. -Edward Kmett On Fri, Feb 5, 2010 at 12:48 PM, Gwern Branwen gwe...@gmail.com wrote: On Fri, Feb 5, 2010 at 6:20 AM, Sittampalam, Ganesh ganesh.sittampa...@credit-suisse.com wrote: Gwern Branwen wrote: On Wed, Feb 3, 2010 at 8:14 PM, Henk-Jan van Tuyl hjgt...@chello.nl wrote: On Wed, 03 Feb 2010 23:34:34 +0100, Neil Mitchell ndmitch...@gmail.com wrote: Hi Gwern, Please update: haskell-src-exts - haskell-src **Unknown** This project was an unqualified success. haskell-src-exts is now one of the most commonly used Haskell libraries, achieved the goals in the project proposal, and is an essential piece of Haskell infrastructure. You can see this using Roel van Dijk's reversed dependencies overview [1]: 23 direct and 57 indirect dependencies on haskell-src-exts-1.8.0 Regards, Henk-Jan van Tuyl And how many of those used haskell-src-exts *before* the SoC project? And would have used it regardless? You can't point to a popular project which got a SoC student, and say look at how popular it is - obviously the SoC student was hugely successful. Regardless of that, is there any reason to disregard Neil's summary and not update your page? Ganesh I prefer to wait. haskell-src-exts was popular before, it was popular after. The question is not whether the patches were applied, or whether the mentor told Google it was successful, but whether it was the best possible use of the SoC slot. If features do not get used, then it wasn't a good SoC. If you know 3 or 4 uses of the new haskell-src-exts features in (relatively) major applications like hlint, then I'll concede the point and mark it a success. -- gwern ___ 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] Re: could we get a Data instance for Data.Text.Text?
On Fri, Feb 5, 2010 at 9:33 AM, Jeremy Shaw jer...@n-heptane.com wrote: I have attached a new version that should work with GHC 6.10, though I have not tested it. Thanks. I fixed the compilation warning, added a Data instance for lazy Text, and released 0.7.1.0. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] online Real World Haskell - tool used?
On Thu, Feb 4, 2010 at 7:51 PM, Sophie itsme...@hotmail.com wrote: I believe the online Real World Haskell book with commenting system was generated with an open-source tool (written by one of the authors?). Any idea where I might find this? See http://bitbucket.org/bos/hgbook for the code. I am also curious what authoring tools were used to write the book. DocBook, emacs, and vi. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Anyone up for Google SoC 2010?
On Fri, Feb 5, 2010 at 8:55 PM, Edward Kmett ekm...@gmail.com wrote: You can add me to the list of voices that were unwilling to use it before the summer-of-code project due to the random incompatibilities caused by the huge supply of extensions it supported out of the box, but who were happy to switch to it after the changes were made to make them configurable. This was indeed the main priority of the project, and the reason why even I would not have recommended anyone to use haskell-src-exts in production before the project. The rest is just gravy that happens to permit a number of applications such as refactoring browsers that were impossible with the previous implementation. And, as I recall, the fairly radical exploratory pretty print . parse = id goal was explicitly listed merely as a secondary goal on the original application. Indeed it was, and I am not aware of any major applications that actually use the exact-print functionality yet (please, tell me if you have one!). I do know of several that make very good use of the new Annotated syntax tree, though, which was introduced as a step towards exact-printing. The benefits of that, together with the configurable extensions, is more than enough to now make me happily recommend haskell-src-exts to anyone working with Haskell source code in any application. The rest is, as you accurately put it, just gravy. I must admit I'm a bit sad to have the value of my project questioned in this way, a project that I myself was more than pleased with, both with the actual work achieved and the significant positive feedback I have received after its conclusion. If haskell-src-exts was indeed popular even before the project, that's all well and good to me. But it doesn't mean that the library offered to the users then was satisfactory, nor does it mean that the project failed to deliver something that those same users needed and/or could make good use of. Even if the number of direct users did not rise dramatically as a consequence of the project, why would it not be valid use of a project slot to greatly improve a library that was already popular? Browsing the numbers [1] posted by Don Stewart in September last year (the Haskell Symposium figures, which is the latest I could find) suggests a substantial increase of downloads of the package both before, during and after the project, but I can only speculate why. And since the project concluded late August, figures for September and onwards would have been more telling. I'm at a loss as to what criteria is actually used to judge success here. It seems to me a bit like the eternal discussion between basic research and applied research. Just because something (research/library/project) doesn't have an immediate, palpable impact and/or delivers a visible tool, that certainly doesn't imply that it doesn't have merit or won't have as profound an impact on the domain, if more diffuse than a tool (or other palpable deliverable) would. /Niklas [1] http://www.galois.com/~dons/hackage/september-2009/total-downloads.html ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Generating repeatable arbitrary values with QuickCheck 2
On Fri, Feb 5, 2010 at 5:19 AM, Martijn van Steenbergen mart...@van.steenbergen.nl wrote: Ryan Ingram wrote: Unfortunately, this makes things like infinite_xs - sequence (repeat arbitrary) no longer work, since the state never comes out the other side. You're asking to execute an infinite number of monadic actions. How can this ever terminate at all? Stefan already gave an example, but to explain slightly further -- There's nothing magical about monadic actions. It's just another function call. In the case of QuickCheck, Gen is a reader monad with a broken = that changes the state of the generator passed to each side: newtype Gen a = Gen (Int - StdGen - a) generate n g (Gen f) = f n g return x = Gen (\_ _ - x) m = f = Gen mbindf where mbindf n g = b where (g1,g2) = split g a = generate n g1 m b = generate n g2 (f a) Now, to see how this generates data for an infinite list, just consider sequence [arbitrary, ... which we can represent as sequence (arbitrary:undefined) Recall the definition of sequence: sequence [] = return [] sequence (a:as) = do x - a xs - sequence as return (x:xs) If we are ever required to evaluate the rest of the list, we'll get undefined and computation will fail. The goal is to get something out of the computation without needing to do so; if that works, then it will work for (arbitrary:arbitrary:undefined) and so on up to an infinite list of actions. Let's try it! generate 42 g $ sequence (aribtrary : undefined) = generate 42 sg $ do x - arbitrary xs - sequence undefined return (x:xs) = generate 42 sg ( arbitrary = \x - sequence undefined = \xs - return (x:xs) ) = let m = arbitrary f = \x - sequence undefined = \xs - return (x:xs) mbindf n g = b where (g1,g2) = split g a = generate n g m b = generate n g (f a) in generate 42 sg (Gen mbindf) = let ... in mbindf 42 sg = let m = arbitrary f = \x - sequence undefined = \xs - return (x:xs) n = 42 g = sg (g1,g2) = split g a = generate n g1 m b = generate n g2 (f a) in b = let ... in generate n g2 (f a) = let ... in generate n g2 (sequence undefined = \xs - return (a:xs) = let m = arbitrary n = 42 g = sg (g1,g2) = split g a = generate n g1 m m1 = sequence undefined f = \xs - return (a:xs) mbindf n1 g3 = b where (g4,g5) = split g3 a1 = generate n1 g4 m1 b = generate n1 g5 (f a1) in generate n g2 (Gen mbindf) = let ... in mbindf n g2 = let m = arbitrary n = 42 g = sg (g1,g2) = split g a = generate n g1 m m1 = sequence undefined f = \xs - return (a:xs) (g4,g5) = split g2 a1 = generate n g4 m1 b = generate n g5 (f a1) in generate n g5 (f a1) = let ... in generate n g5 (return (a:a1)) = let ... in generate n g5 (Gen (\_ _ - (a:a1))) = let ... in (\_ _ - (a:a1)) n g5 = let ... in (a:a1) = let ... in (generate n g1 m : a1) = let ... in (generate n g1 arbitrary : a1) = let ... in (arbitrary : a1) We have now output a cons cell with an arbitrary value without even evaluating the rest of the input to sequence (which is undefined; could have been 'repeat aribtrary' or anything else) Lazy evaluation is pretty neat :) -- ryan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Anyone up for Google SoC 2010?
On Fri, Feb 5, 2010 at 3:38 PM, Niklas Broberg niklas.brob...@gmail.com wrote: I'm at a loss as to what criteria is actually used to judge success here. It seems to me a bit like the eternal discussion between basic research and applied research. Just because something (research/library/project) doesn't have an immediate, palpable impact and/or delivers a visible tool, that certainly doesn't imply that it doesn't have merit or won't have as profound an impact on the domain, if more diffuse than a tool (or other palpable deliverable) would. /Niklas There may be an eternal discussion on it, but it seems pretty clear to me which side SoC comes down on: http://code.google.com/soc/ Through Google Summer of Code, accepted student applicants are paired with a mentor or mentors from the participating projects, thus gaining exposure to real-world software development scenarios and the opportunity for employment in areas related to their academic pursuits. In turn, the participating projects are able to more easily identify and bring in new developers. Best of all, more source code is created and released for the use and benefit of all. or http://socghop.appspot.com/document/show/program/google/gsoc2009/faqs#goals # Google Summer of Code has several goals: * Get more open source code created and released for the benefit of all * Inspire young developers to begin participating in open source development * Help open source projects identify and bring in new developers and committers * Provide students the opportunity to do work related to their academic pursuits during the summer (think flip bits, not burgers) * Give students more exposure to real-world software development scenarios (e.g., distributed development, software licensing questions, mailing-list etiquette) -- gwern ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Anyone up for Google SoC 2010?
There may be an eternal discussion on it, but it seems pretty clear to me which side SoC comes down on: http://code.google.com/soc/ I'm really not sure what you're getting at. How do the points you list not relate to my project? And how does my analogy contradict any of those points? If the goal is to have more source code [..] created and released for the use and benefit of all, how does my project fail to achieve this? /Niklas ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Anyone up for Google SoC 2010?
If the goal is to have more source code [..] created and released for the use and benefit of all, how does my project fail to achieve this? Also, it is worth pointing out that from Google's point of view, they are most interested in whether the programme yields students who stick around and continue to contribute to open source projects. I think Niklas and his HSE library very visibly pass on both criteria - quality code that is actively used, and a continuing contribution. Regards, Malcolm ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Generating repeatable arbitrary values with QuickCheck 2
On Fri, Feb 5, 2010 at 3:39 PM, Ryan Ingram ryani.s...@gmail.com wrote: On Fri, Feb 5, 2010 at 5:19 AM, Martijn van Steenbergen mart...@van.steenbergen.nl wrote: Ryan Ingram wrote: Unfortunately, this makes things like infinite_xs - sequence (repeat arbitrary) no longer work, since the state never comes out the other side. You're asking to execute an infinite number of monadic actions. How can this ever terminate at all? Stefan already gave an example, but to explain slightly further -- There's nothing magical about monadic actions. It's just another function call. In the case of QuickCheck, Gen is a reader monad with a broken = that changes the state of the generator passed to each side: Incidentally, the alternative Gen I suggested also works for infinite lists. (It's equivalent to StateT StdGen (Reader Int), using the StateT from Control.Monad.State.Lazy.) The problem, as Ryan pointed out, is that you can't access the state after the infinite computation, so you can't create two infinite streams or an infinite tree, which the current definition of Gen allows. More concretely, this works fine: stream = do x - arbitrary xs - stream return (x:xs) but you can't call arbitrary after you call stream broken = do xs - stream y - arbitrary -- can't evaluate until stream is fully evaluated (i.e., never) The present definition of Gen avoids this by splitting the StdGen at every =, but that creates the situation where two expressions which should be equivalent produce different results in some contexts. It isn't clear to me which implementation is best. I lean towards the StateT-like implementation, on the theory that it's limitations are easier to explain, but I guess it comes down to whether we want to make life easier for (a) people creating infinite structures or (b) people who need reproducible results. -- Dave Menendez d...@zednenem.com http://www.eyrie.org/~zednenem/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] a beginner question: decorate-op-undecorate
On Feb 5, 2010, at 12:34 , Aran Donohue wrote: data Binding = Binding Var (Either Value [Value]) representing a variable bound either to a fixed value or that has a list of possible values. I'd like to perform an operation on say, the fixed-value members of a list of bindings. Data.Either has partitionEithers---I'd essentially like to use partitionEithers, but in a way that it peeks into the value field of the binding. For the sake of argument, let's say I can't or can't modify Binding to move the Either to the outside. What would be an idiomatic Haskell way to accomplish this? Currently I've got liftedPartitionEithers :: [a] - (a - Either b c) - ([a], [a]) which is my own version of partitionEithers that calls a selector first. Another option would be to map each Binding to a new datatype that has the Either on the outside, use partitionEithers, and map back. Hm. Does it make sense to make this a Functor? instance Functor Binding where fmap f (Binding v e) = Binding v (f e) -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allb...@kf8nh.com system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu electrical and computer engineering, carnegie mellon universityKF8NH PGP.sig Description: This is a digitally signed message part ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: sendfile leaking descriptors on Linux?
On Feb 5, 2010, at 02:56 , Bardur Arantsson wrote: I should have posted this earlier, but the exact message I'm seeing in the case where the Bad Client disconnects is this: hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) Oddly, I haven't been able to reproduce this using a wget client with a ^C during transfer. When I disconnect wget with ^C or pkill wget or even pkill -9 wget, I get this message: hums: Network.Socket.SendFile.Linux: resource vanished (Connection reset by peer) (and no leak, as observed by lsof | grep hums). Broken pipe is normally handled as a signal, and is only mapped to an error if SIGPIPE is set to SIG_IGN. I can well imagine that the SIGPIPE signal handler isn't closing resources properly; a workaround would be to use the System.Posix.Signals API to ignore SIGPIPE, but I don't know if that would work as a general solution (it would depend on what other uses of pipes/sockets exist). -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allb...@kf8nh.com system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu electrical and computer engineering, carnegie mellon universityKF8NH PGP.sig Description: This is a digitally signed message part ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] a beginner question: decorate-op-undecorate
On Fri, Feb 5, 2010 at 10:34 AM, Aran Donohue aran.dono...@gmail.com wrote: What would be an idiomatic Haskell way to accomplish this? Currently I've got liftedPartitionEithers :: [a] - (a - Either b c) - ([a], [a]) which is my own version of partitionEithers that calls a selector first. Since you are not using b or c anywhere else, the only thing you care about in that Either is whether it is Left or Right. Which makes it seem much more like a Bool. After this conversion, I can hoogle for your signature. http://haskell.org/hoogle/?hoogle=[a]+-%3E+%28a+-%3E+Bool%29+-%3E+%28[a]%2C[a]%29 Which gives, among other things, Data.List.partition :: (a - Bool) - [a] - ([a],[a]). Without more details about the precise thing you want to accomplish, I don't know what else to say. Many idioms are about the details of the problem, even down to argument order. Luke ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] a beginner question: decorate-op-undecorate
On Feb 5, 2010, at 19:13 , Brandon S. Allbery KF8NH wrote: Hm. Does it make sense to make this a Functor? instance Functor Binding where fmap f (Binding v e) = Binding v (f e) Inaccurate/incomplete as written, since Functor expects kind (*) and Binding is (* - *). You'd have to fix v to declare instances. -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allb...@kf8nh.com system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu electrical and computer engineering, carnegie mellon universityKF8NH PGP.sig Description: This is a digitally signed message part ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] a beginner question: decorate-op-undecorate
Thanks for the helpful thoughts. I guess I was just reaching for a Haskell version of a programming pattern from other languages---dealing with baggage if you will. Thanks, Aran On Fri, Feb 5, 2010 at 7:24 PM, Luke Palmer lrpal...@gmail.com wrote: On Fri, Feb 5, 2010 at 10:34 AM, Aran Donohue aran.dono...@gmail.com wrote: What would be an idiomatic Haskell way to accomplish this? Currently I've got liftedPartitionEithers :: [a] - (a - Either b c) - ([a], [a]) which is my own version of partitionEithers that calls a selector first. Since you are not using b or c anywhere else, the only thing you care about in that Either is whether it is Left or Right. Which makes it seem much more like a Bool. After this conversion, I can hoogle for your signature. http://haskell.org/hoogle/?hoogle=[a]+-%3E+%28a+-%3E+Bool%29+-%3E+%28[a]%2C[a]%29 Which gives, among other things, Data.List.partition :: (a - Bool) - [a] - ([a],[a]). Without more details about the precise thing you want to accomplish, I don't know what else to say. Many idioms are about the details of the problem, even down to argument order. Luke ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] cabal fun (not)
On 6 February 2010 01:05, Johannes Waldmann waldm...@imn.htwk-leipzig.de wrote: so please please please have cabal install fail with some error message if (that is, before) the install would break anything. - J. If you upgrade a library, it will break all other libraries that depend upon it. ghc-pkg list will tell you which libraries are broken and need to be rebuilt. -- Ivan Lazar Miljenovic ivan.miljeno...@gmail.com IvanMiljenovic.wordpress.com Joan Crawford - I, Joan Crawford, I believe in the dollar. Everything I earn, I spend. - http://www.brainyquote.com/quotes/authors/j/joan_crawford.html ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] safe lazy IO or Iteratee?
Benchmark attached. It just enumerates a list until EOF is reached. An interesting thing I've noticed is that IterateeMCPS performs better with no optimization, but -O2 gives IterateeM the advantage. Their relative performance depends heavily on the chunk size -- for example, CPS is much faster at chunk size 1, but slower with 100-element chunks. On Fri, Feb 5, 2010 at 08:56, John Lato jwl...@gmail.com wrote: On Fri, Feb 5, 2010 at 4:31 PM, Valery V. Vorotyntsev valery...@gmail.com wrote: John Lato jwl...@gmail.com wrote: Both designs appear to offer similar performance in aggregate, although there are differences for particular functions. I haven't yet had a chance to test the performance of the CPS variant, although Oleg has indicated he expects it will be higher. @jwlato: Do you mind creating `IterateeCPS' tree in http://inmachina.net/~jwlato/haskell/iteratee/src/Data/, so we can start writing CPS performance testing code? I'm working on the CPS version and will make it public when it's done. It may take a week or so; this term started at 90 and has picked up. I have several benchmark sources that aren't public yet, but I can put them online for your perusal. AFAICS, you have benchmarks for IterateeM-driven code already: http://inmachina.net/~jwlato/haskell/iteratee/tests/benchmarks.hs Those will make more sense when I've added the context of the codebases in use. There are several more sets of output that I simply haven't published yet, including bytestring-based variants. John Millikin jmilli...@gmail.com wrote: I wrote some criterion benchmarks for IterateeM vs IterateeCPS, and the CPS version was notably slower. I don't understand enough about CPS to diagnose why, but the additional runtime was present in even simple cases (reading from a file, writing back out). That's very interesting. I wonder if I'll see the same, and if I'd be able to figure it out myself... Did you benchmark any cases without doing IO? Sometimes the cost of the IO can overwhelm any other measurable differences, and also disk caching can affect results. Criterion should highlight any major outliers, but I still like to avoid IO when benchmarking unless strictly necessary. @jmillikin: Could you please publish those benchmarks? +1 John -- Benchmark for Oleg Kiselyov's iteratees. You will need: -- -- http://okmij.org/ftp/Haskell/Iteratee/LowLevelIO.hs -- http://okmij.org/ftp/Haskell/Iteratee/IterateeM.hs -- http://okmij.org/ftp/Haskell/Iteratee/IterateeMCPS.hs -- -- -- ghc --make -O2 benchmark.hs import Criterion.Main import Criterion.Config import qualified IterateeM as M import qualified IterateeMCPS as CPS import qualified Control.Monad.Identity as I config = defaultConfig { cfgPerformGC = ljust True } enumM :: Monad m = Int - Int - M.IterV Int m a - M.Iteratee Int m a enumM n = M.enum_pure_nchunk [0..n] enumCPS :: Monad m = Int - Int - CPS.Iteratee Int m a - m (CPS.Iteratee Int m a) enumCPS n = CPS.enum_pure_nchunk [0..n] runM :: (M.IterV el I.Identity () - M.Iteratee el' I.Identity a) - a runM enum = I.runIdentity . M.run $ M.skip_till_eof M.== enum runCPS :: Monad m = (CPS.Iteratee el m () - CPS.Iteratee el' I.Identity a) - a runCPS enum = I.runIdentity . CPS.run $ enum CPS.skip_till_eof main :: IO () main = defaultMainWith config (return ()) [ bgroup IterateeM [ bench 100/10 $ whnf runM $ enumM 100 10 , bench 200/10 $ whnf runM $ enumM 200 10 , bench 300/10 $ whnf runM $ enumM 300 10 ] , bgroup IterateeCPS [ bench 100/10 $ whnf runCPS $ enumCPS 100 10 , bench 200/10 $ whnf runCPS $ enumCPS 200 10 , bench 300/10 $ whnf runCPS $ enumCPS 300 10 ] ] ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: programmatic DB interface?
On Fri, Feb 5, 2010 at 10:38, Johannes Waldmann waldm...@imn.htwk-leipzig.de wrote: As I posted earlier, using 'T' to separate date and time is correct ISO8601 according to wikipedia[1]. So you're saying 2009-12-20 16:55:57.297 (returned by the psql server) is wrong, and it should instead send 2009-12-20T16:55:57.297Z ? Well, it isn't necessarily *wrong* ;-) 2009-12-20 16:55:57.297 is made up of two pieces, one for date and one for time. 2009-12-20T16:55:57.297Z is made up of one piece, which specifies both date and time. This is why I believe that the function ISO8601DateFormat is correct when it provides a format for a combined date and time. What would be the query to obtain this format? I don't see this mentioned anyplace on http://www.postgresql.org/docs/8.3/interactive/functions-datetime.html Neither do I, I don't find anything relating to ISO8601 dates (they seem more concerned with ISO DOW and year). Perhaps we take this back to haskell-cafe (or libraries?) as it might be of general interest. Sure, why not. It was most likely a mistake on my side to drop haskell-cafe in the first place. /M -- Magnus Therning(OpenPGP: 0xAB4DFBA4) magnus@therning.org Jabber: magnus@therning.org http://therning.org/magnus identi.ca|twitter: magthe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe