[Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
Jeremy O'Donoghue wrote: Apologies folks, rant coming up... [...] Bear in mind that as I have a (very) demanding day job and a young family, I actually have no more than 3-4 hours a week (at best) to spend maintaining wxHaskell. Bear in mind also that my interest in wxHaskell was always to be able to develop software in Haskell, not fight with linkers and build systems (I get enough of that at work, thanks). While that's my personal problem, and others may not have the same issues, so please feel free to not care at all, it's worth bearing in mind... wxHaskell consists of a set of C bindings over the C++ core of wxWidgets. Broadly speaking, these unmangle the C++ names and do little else. [...] Actually, I don't completely agree. I think that the issue is that making things better on Windows (and likely OS X as well) requires co-ordinated and agreed action across a number of areas. This means getting a moderate number of people, most of whom give up their time and effort for free, and for the good of the community, to agree on what is needed and to prioritize it in a co-ordinated way. The action needed by any individual might be relatively small, but without community agreement and action, the end goal cannot be achieved. Jeremy, I very much appreciate your efforts as a maintainer of wxHaskell, even more so after I have begun to write a small helper application for my video stuff (which is a bit stalled now because I didn't have the courage to wrestle with wxGraphicsContext to get antialiased drawings). Would you put a flattr button [1] on the wxHaskell page? This way, people like me would be able to show their appreciation by donating a small amount of *money*. Granted, it is not much and certainly does not help with any of your external constraints, but it is a more forthright form of showing that your work is valued than a silent download or virtual nod. [1]: http://flattr.com Regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
Hello Heinrich, Saturday, October 2, 2010, 1:36:48 PM, you wrote: Would you put a flattr button [1] on the wxHaskell page? This way, people like me would be able to show their appreciation by donating a this page doesn't describe how to pay and how to got the money received. if Jeremy lives in right country, i suggest to use PayPal donations system. it allows to pay by credit card and then receive money to author's credit card PayPal provides you the donation button like one i used at http://freearc.org/Donations.aspx -- Best regards, Bulatmailto:bulat.zigans...@gmail.com ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
On Sat, Oct 2, 2010 at 4:32 AM, Bulat Ziganshin bulat.zigans...@gmail.com wrote: Hello Heinrich, Saturday, October 2, 2010, 1:36:48 PM, you wrote: Would you put a flattr button [1] on the wxHaskell page? This way, people like me would be able to show their appreciation by donating a this page doesn't describe how to pay and how to got the money received. if Jeremy lives in right country, i suggest to use PayPal donations system. it allows to pay by credit card and then receive money to author's credit card Because of the way flattr distributes my money (i.e. donating has 0 marginal cost to me), I am much more likely to donate using flattr than paypal. Luke ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
2010/10/2 Luke Palmer lrpal...@gmail.com: On Sat, Oct 2, 2010 at 4:32 AM, Bulat Ziganshin bulat.zigans...@gmail.com wrote: Hello Heinrich, Saturday, October 2, 2010, 1:36:48 PM, you wrote: Would you put a flattr button [1] on the wxHaskell page? This way, people like me would be able to show their appreciation by donating a this page doesn't describe how to pay and how to got the money received. if Jeremy lives in right country, i suggest to use PayPal donations system. it allows to pay by credit card and then receive money to author's credit card Because of the way flattr distributes my money (i.e. donating has 0 marginal cost to me), I am much more likely to donate using flattr than paypal. Is it right that by using flattr, you end up donating the same amount of money to every flattred person in a month? So you can donate more the previous month to some project you value less than another project the next month. This seems weird to me. Cheers, Thu ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
Regarding GUIs, I really miss a pure functional framework for doing so. Currently I'm using Microsoft's WPF, and that is more or less declarative, a bit like BOOPSI or MUI on the good old Amiga days. But WPF has so many little quirks, not to mentioned a weakly typed XML-like language called XAML. Still it offers the best experiences I had so far, because it is very composable. What I would love is to build GUIs the Fruit/Yampa or maybe Reactive/Elerea way, using a graphical editor if possible. And allow separation of data (model and view-model) and looks (styling, CSS, themes...) Oh and it should preferably make use of the GPU as much as possible, where it makes sense at least. Anyway knows about such a framework in Haskell? It's a gigantic undertaking, but maybe if someone can make the basic framework, others in the community will develop controls for it? Cheers, Peter Verswyvelen On Sat, Oct 2, 2010 at 1:20 PM, Vo Minh Thu not...@gmail.com wrote: 2010/10/2 Luke Palmer lrpal...@gmail.com: On Sat, Oct 2, 2010 at 4:32 AM, Bulat Ziganshin bulat.zigans...@gmail.com wrote: Hello Heinrich, Saturday, October 2, 2010, 1:36:48 PM, you wrote: Would you put a flattr button [1] on the wxHaskell page? This way, people like me would be able to show their appreciation by donating a this page doesn't describe how to pay and how to got the money received. if Jeremy lives in right country, i suggest to use PayPal donations system. it allows to pay by credit card and then receive money to author's credit card Because of the way flattr distributes my money (i.e. donating has 0 marginal cost to me), I am much more likely to donate using flattr than paypal. Is it right that by using flattr, you end up donating the same amount of money to every flattred person in a month? So you can donate more the previous month to some project you value less than another project the next month. This seems weird to me. Cheers, Thu ___ 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: I still cannot seem to get a GUI working under Windows.
On Oct 2, 2010, at 3:30 PM, Peter Verswyvelen wrote: Regarding GUIs, I really miss a pure functional framework for doing so. Currently I'm using Microsoft's WPF, and that is more or less declarative, a bit like BOOPSI or MUI on the good old Amiga days. But WPF has so many little quirks, not to mentioned a weakly typed XML-like language called XAML. Still it offers the best experiences I had so far, because it is very composable. Are you using WPF with C# or F#? With F# it can feel pretty functional.___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
Vo Minh Thu wrote: Is it right that by using flattr, you end up donating the same amount of money to every flattred person in a month? Yes. So you can donate more the previous month to some project you value less than another project the next month. This seems weird to me. That's the price of the vanishing marginal cost of flattr donations. :) But how about putting it this way: isn't it great that you no longer have to worry about attributing fair values to each project, since this cognitive burden would make you less likely of donating in the first place? ;) Personally, I revisit projects I value a lot every month anyway, which boils down to a larger share in the end. Regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
Peter Verswyvelen wrote: Regarding GUIs, I really miss a pure functional framework for doing so. We all do, we all do. ;) Currently I'm using Microsoft's WPF, and that is more or less declarative, a bit like BOOPSI or MUI on the good old Amiga days. But WPF has so many little quirks, not to mentioned a weakly typed XML-like language called XAML. Still it offers the best experiences I had so far, because it is very composable. What I would love is to build GUIs the Fruit/Yampa or maybe Reactive/Elerea way, using a graphical editor if possible. And allow separation of data (model and view-model) and looks (styling, CSS, themes...) Oh and it should preferably make use of the GPU as much as possible, where it makes sense at least. Anyway knows about such a framework in Haskell? It's a gigantic undertaking, but maybe if someone can make the basic framework, others in the community will develop controls for it? I have concocted a tiny FRP library for my little wxHaskell project, which works quite nicely. Its main feature is that it can hook into any part of wxHaskell; thanks to higher-order functions, there is absolutely no need to duplicate the GUI API. In a sense, the point is that FRP is just a different way of talking about callback functions. It is by no means finished, though, and my project has currently hit a snag because wxHaskell's support for antialiased graphics routines is still in its infancy. No idea how to proceed yet. Regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: I still cannot seem to get a GUI working under Windows.
For another model of GUIs, see Tangible Values ( http://www.haskell.org/haskellwiki/TV), which is composable MVC. And amen to targeting GPUs. In addition to getting clunky, imperative GUI frameworks like wx gtk working robustly and easily in Haskell across platforms, I'd love to see more powerful, functional-friendly re-thinking of UIs. And if a new generation of GUIs comes out scrapping legacy toolkits, and the look is not what people are used to, then exploiting GPUs and good visual design could lead to something that looks better and is more fun to use. I imagine someone looking at a lovely app and saying, Wow -- great interface! I bet it was programmed in Haskell. - Conal On Sat, Oct 2, 2010 at 6:30 AM, Peter Verswyvelen bugf...@gmail.com wrote: Regarding GUIs, I really miss a pure functional framework for doing so. Currently I'm using Microsoft's WPF, and that is more or less declarative, a bit like BOOPSI or MUI on the good old Amiga days. But WPF has so many little quirks, not to mentioned a weakly typed XML-like language called XAML. Still it offers the best experiences I had so far, because it is very composable. What I would love is to build GUIs the Fruit/Yampa or maybe Reactive/Elerea way, using a graphical editor if possible. And allow separation of data (model and view-model) and looks (styling, CSS, themes...) Oh and it should preferably make use of the GPU as much as possible, where it makes sense at least. Anyway knows about such a framework in Haskell? It's a gigantic undertaking, but maybe if someone can make the basic framework, others in the community will develop controls for it? Cheers, Peter Verswyvelen On Sat, Oct 2, 2010 at 1:20 PM, Vo Minh Thu not...@gmail.com wrote: 2010/10/2 Luke Palmer lrpal...@gmail.com: On Sat, Oct 2, 2010 at 4:32 AM, Bulat Ziganshin bulat.zigans...@gmail.com wrote: Hello Heinrich, Saturday, October 2, 2010, 1:36:48 PM, you wrote: Would you put a flattr button [1] on the wxHaskell page? This way, people like me would be able to show their appreciation by donating a this page doesn't describe how to pay and how to got the money received. if Jeremy lives in right country, i suggest to use PayPal donations system. it allows to pay by credit card and then receive money to author's credit card Because of the way flattr distributes my money (i.e. donating has 0 marginal cost to me), I am much more likely to donate using flattr than paypal. Is it right that by using flattr, you end up donating the same amount of money to every flattred person in a month? So you can donate more the previous month to some project you value less than another project the next month. This seems weird to me. Cheers, Thu ___ 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 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Lambda-case / lambda-if
Hi Cafe, I implemented the proposed Haskell' feature lambda-case/lambda-if [1] during the Haskell Implementors Workshop yesterday for a bit of fun. The patches are online [2, 3]. The feature is demonstrated in this GHCi session: $ inplace/bin/ghc-stage2 --interactive -XLambdaCase GHCi, version 7.1.20101002: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking ... done. Prelude (if then Haskell else Cafe) False Cafe Prelude (case of 1 - One; _ - Not-one) 1 One Prelude :q Do you like this feature and think it would be worth incorporating this into GHC? Or is it too specialised to be of use? If there is enough support, I'll create a ticket and see what GHC HQ make of it. Max [1] http://hackage.haskell.org/trac/haskell-prime/ticket/41 [2] http://www.omega-prime.co.uk/files/LambdaCase-Testsuite.patch [3] http://www.omega-prime.co.uk/files/LambdaCase-Compiler.patch ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
Max == Max Bolingbroke batterseapo...@hotmail.com writes: Prelude (if then Haskell else Cafe) False Max Cafe My reaction is to ask: Can you write this as: (if then else) False Haskell Cafe ? -- Colin Adams Preston Lancashire () ascii ribbon campaign - against html e-mail /\ www.asciiribbon.org - against proprietary attachments ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
On Sat, 2 Oct 2010, Max Bolingbroke wrote: Hi Cafe, I implemented the proposed Haskell' feature lambda-case/lambda-if [1] during the Haskell Implementors Workshop yesterday for a bit of fun. The patches are online [2, 3]. The feature is demonstrated in this GHCi session: $ inplace/bin/ghc-stage2 --interactive -XLambdaCase GHCi, version 7.1.20101002: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking ... done. Prelude (if then Haskell else Cafe) False Cafe Prelude (case of 1 - One; _ - Not-one) 1 One Prelude :q Do you like this feature and think it would be worth incorporating this into GHC? Or is it too specialised to be of use? If there is enough support, I'll create a ticket and see what GHC HQ make of it. Nice! Concerning if-then-else I would more like to see an according function to go to Data.Bool, then we won't need more syntactic sugar like if-then-else. However the lambda-case would be useful for me. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
On Sat, 2 Oct 2010, Colin Paul Adams wrote: Max == Max Bolingbroke batterseapo...@hotmail.com writes: Prelude (if then Haskell else Cafe) False Max Cafe My reaction is to ask: Can you write this as: (if then else) False Haskell Cafe ? Sure: ifThenElse :: Bool - a - a - a ifThenElse True x _ = x ifThenElse False _ y = y Prelude ifThenElse False Haskell Cafe (I have done this in utility-ht, and called it if'.) ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: happstack-ixset internals/performance (was Re: [Haskell-cafe] Inverse of HaskellDB)
In the current version of IxSet, the performance of querying on just the Lon would be essentially the same as if you just had a Data.Map Lon Point. But the queries on the second index are current not so great. There is work in progress to rewrite the internals of IxSet to be based on a kd-tree, in which case your query should be pretty efficient. So, that answer is pretty vague :) I am in the process of wrapping up happstack 0.6 which has focused on fixing some performance issues with happstack-server, and refactoring the code so that user API and internals are more clearly separated and better documented. happstack 0.7 is all about happstack-state. A key aspect will be nailing down some solid performance benchmarks instead of vague hand waving :) The numbers you give are certainly within the scope of what we would like 0.7 to be able to handle. Also, I should note that happstack-state and happstack-ixset are independent from each other. You can easily use something other than IxSet to store your points and still use happstack-state. - jeremy On Fri, Oct 1, 2010 at 1:53 PM, Thomas M. DuBuisson thomas.dubuis...@gmail.com wrote: That is pretty close to how it would look using happstack-state. Here is a complete, runnable example which defines the types, a query, creates/initializes the database, performs the query, and prints the results. [snip] How is data stored in Happstack.State? I see the Component instance uses fromList from happstack-ixset but can't find any information on the algorithm used or its efficiency (computationally or wrt space). If making this more concrete helps then here is a possible use: == GPS Points == I have a GPS logger that logs every 10 seconds when I jog. Jogging for an hour a day for the past 180 days has resulted in 64k points. Pretending I hosted a site for joggers (and all points were in the same DB) I could easily result in a billion points ( 20K users). Would happstack-ixset code in the form points @ (Lon -120) @ (Lon -125) @ (Lat 45) @ (Lat 50) perform reasonably? Cheers, Thomas ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
On 2 October 2010 20:23, Max Bolingbroke batterseapo...@hotmail.com wrote: Do you like this feature and think it would be worth incorporating this into GHC? Or is it too specialised to be of use? If there is enough support, I'll create a ticket and see what GHC HQ make of it. Nice work! I like it and have wanted it for a while, and I know many in the #haskell IRC channel would like it. The case is especially useful. Maybe the if is only useful sometimes. A benefit for lambda-case that I'll throw in the mix is: main = do args - getArgs case args of [path] - do exists - doesFileExist filepath if exists then readFile filepath = putStrLn else error file does not exist _ - error usage: foo filename becomes: main = do getArgs = case of [path] - doesFileExist filepath = if then readFile filepath = putStrLn else error file does not exist _ - error usage: foo filename There's nothing more annoying than having to introduce intermediate bindings when you're going to immediate pattern match against it immediately and never use it again. It's both annoying to have to think of a variable name that makes sense and is not in scope or will be in scope, and annoying to type it out, and it's just ugly. This is *not* a special-case, it happens all the time and it's one of the few things in the syntax I wish could be updated. I vote yes, yes, and double yes! ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
I just had a look at hpaste.org, and, amusingly, the first paste has this: down - openLazyURI http://list.iblocklist.com/?list=bt_level1; case down of Left _ - error Could not download file Right bs - do input - bs ... I can collect a huge list of instances of this annoying pattern from Hackage and Google Code Search if it will encourage GHC HQ to make it an extension. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
On 2 October 2010 19:33, Henning Thielemann lemm...@henning-thielemann.dewrote: On Sat, 2 Oct 2010, Max Bolingbroke wrote: ... lambda-case/lambda-if ... Nice! Concerning if-then-else I would more like to see an according function to go to Data.Bool, then we won't need more syntactic sugar like if-then-else. However the lambda-case would be useful for me. And I was just reading this entry in the wiki: http://www.haskell.org/haskellwiki/If-then-else Best, Ozgur ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
On 02.10.2010, at 20:35, Henning Thielemann wrote: On Sat, 2 Oct 2010, Colin Paul Adams wrote: Prelude (if then Haskell else Cafe) False Max Cafe My reaction is to ask: Can you write this as: (if then else) False Haskell Cafe ? Sure: ifThenElse :: Bool - a - a - a ifThenElse True x _ = x ifThenElse False _ y = y Prelude ifThenElse False Haskell Cafe You can use a similar approach for case expressions ; ) import Prelude hiding ( catch ) import System.IO.Unsafe ( unsafePerformIO ) import Control.Exception ( catch, evaluate, PatternMatchFail ) caseOf :: a - [a - b] - b caseOf x = unsafePerformIO . firstMatch . map ($x) firstMatch :: [a] - IO a firstMatch (x:xs) = catch (evaluate x) (handlePatternFail (firstMatch xs)) handlePatternFail :: a - PatternMatchFail - a handlePatternFail x _ = x test = (flip caseOf [\1 - One, \_ - Not-one]) 1 Well, to tell the truth this does not work correctly as the following example shows. test2 = (flip caseOf [\1 - ((\2 - One) 3), \_ - Not-one]) 1 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
On Sat, Oct 2, 2010 at 4:13 PM, Christopher Done chrisd...@googlemail.com wrote: There's nothing more annoying than having to introduce intermediate bindings when you're going to immediate pattern match against it immediately and never use it again. It's both annoying to have to think of a variable name that makes sense and is not in scope or will be in scope, and annoying to type it out, and it's just ugly. This is *not* a special-case, it happens all the time and it's one of the few things in the syntax I wish could be updated. I vote yes, yes, and double yes! I wholly agree with Christopher and for the same reason, +1. Thanks, -- Felipe. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: happstack-ixset internals/performance (was Re: [Haskell-cafe] Inverse of HaskellDB)
Thanks Jeremy, I just wrote up my own little analysis (below) while you were responding. I'll look for the kd-tree work; if I see discussion (and am stupid enough to heap more work onto my plate) then I might get involved. Oops, didn't send... Cheers, Thomas - So another glance tells me there is a list of maps (one element for each index method) and it uses Data.Map under the hood. So I have O(m lg n) where m is the number of index methods and n is the number of elements. Space wise, I think Data.Map takes up 6 words per Bin constructor (1 for the constructor, 1 for the 'Size' and one for the pointer indirection for each additional field), so the space is 6 * n * m * w where w is the word size. This means indexing by 5 methods for 1M entries takes about 256MB, assuming 28B per entry that's 28MB of data + 256 indexing ~ 282MB needed. Indexing my imaginary 1B points by user,date,lat,lon is 6 * 2^30 * 4 * 8 - or about 192 GB of indexing + 28GB of data for 220GB total. Obviously I shouldn't be talking about keeping a live data set of 28GB in memory let alone indexing it all, but I was just curious about the ratio (220MB for 1M points, which is just one heavy user). On Sat, 2010-10-02 at 14:09 -0500, Jeremy Shaw wrote: In the current version of IxSet, the performance of querying on just the Lon would be essentially the same as if you just had a Data.Map Lon Point. But the queries on the second index are current not so great. There is work in progress to rewrite the internals of IxSet to be based on a kd-tree, in which case your query should be pretty efficient. So, that answer is pretty vague :) I am in the process of wrapping up happstack 0.6 which has focused on fixing some performance issues with happstack-server, and refactoring the code so that user API and internals are more clearly separated and better documented. happstack 0.7 is all about happstack-state. A key aspect will be nailing down some solid performance benchmarks instead of vague hand waving :) The numbers you give are certainly within the scope of what we would like 0.7 to be able to handle. Also, I should note that happstack-state and happstack-ixset are independent from each other. You can easily use something other than IxSet to store your points and still use happstack-state. - jeremy On Fri, Oct 1, 2010 at 1:53 PM, Thomas M. DuBuisson thomas.dubuis...@gmail.com wrote: That is pretty close to how it would look using happstack-state. Here is a complete, runnable example which defines the types, a query, creates/initializes the database, performs the query, and prints the results. [snip] How is data stored in Happstack.State? I see the Component instance uses fromList from happstack-ixset but can't find any information on the algorithm used or its efficiency (computationally or wrt space). If making this more concrete helps then here is a possible use: == GPS Points == I have a GPS logger that logs every 10 seconds when I jog. Jogging for an hour a day for the past 180 days has resulted in 64k points. Pretending I hosted a site for joggers (and all points were in the same DB) I could easily result in a billion points ( 20K users). Would happstack-ixset code in the form points @ (Lon -120) @ (Lon -125) @ (Lat 45) @ (Lat 50) perform reasonably? Cheers, Thomas ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: Haskell web development entries on the Wiki
I understand the advantages to splitting into multiple pages, but on the other hand it *does* make it more difficult to locate information. My guess is a good search function on the wiki will make that point moot. Overall, looks like you've done a great job, thanks! A few minor comments: * Should we rename HAppS to Happstack everywhere? * Does pass.net still exist anywhere? Same for parallel web. * Should older, unmaintained stuff (Wash, for example) be removed entirely, placed on its own page or be obviously marked as unmaintained? Michael On Fri, Oct 1, 2010 at 10:50 PM, Christopher Done chrisd...@googlemail.com wrote: Decided to move this to a separate thread. I went ahead and refactored the wiki entries: http://www.haskell.org/haskellwiki/Web Now we have the following Web/ sections: Servers Frameworks Interfaces to frameworks Databases and Persistence Libraries Testing and Verification Content Management and Forums and Discussion Literature (research, talks and blogs) Existing Haskell web applications Ongoing projects and ideas And Web/Libraries has the following sections: URLs and Routing Templating Sessions and Authentication CGI Forms JavaScript and AJAX CSS I will add all these pages to the Web category, but not yet, I want to get rid of this page: http://www.haskell.org/haskellwiki/?title=Applications_and_libraries/Web_programming I've nearly finished moving all of it to organised sections in this new hierarchy. The advantage of doing this is that I have to manually check each thing listed and I discover that quite a few are dead links and no longer maintained. Ideally this page http://www.haskell.org/haskellwiki/Web/Frameworks would have a list of all actually active web projects, and those would be listed at the top, or perhaps there should be another page Web/Frameworks/Active or whatnot. Anyone care to help take this page apart Applications and libraries/Web programming and move it to reasonable pages? Thoughts? ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Haskell web development entries on the Wiki
On Sat, Oct 2, 2010 at 4:13 PM, Michael Snoyman mich...@snoyman.com wrote: I understand the advantages to splitting into multiple pages, but on the other hand it *does* make it more difficult to locate information. My guess is a good search function on the wiki will make that point moot. Overall, looks like you've done a great job, thanks! A few minor comments: * Should we rename HAppS to Happstack everywhere? I think we should. No one is using the old HAppS code, so references are just misleading. -- gwern ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: Haskell web development entries on the Wiki
On 2 October 2010 22:13, Michael Snoyman mich...@snoyman.com wrote: I understand the advantages to splitting into multiple pages, but on the other hand it *does* make it more difficult to locate information. It does? What's an example? I'll fix it. My guess is a good search function on the wiki will make that point moot. Probably! * Does pass.net still exist anywhere? Same for parallel web. I couldn't find any references to pass.net. * Should older, unmaintained stuff (Wash, for example) be removed entirely, placed on its own page or be obviously marked as unmaintained? Yes, I think so. There are a lot of frameworks on that page that are just cluttering it up, most of them are unmaintained or don't really have a big user-base. Perhaps we should split it to Active / Recommended and Inactive / Unevaluated or something like that. If I was looking for web frameworks I'd want to know which ones were actively maintained and then *maybe* what other ones there are. It could well be two pages. Frameworks/Active or Recommended_Frameworks and then the other. I'm not sure. Thoughts, chaps? On 2 October 2010 22:24, Gwern Branwen gwe...@gmail.com wrote: * Should we rename HAppS to Happstack everywhere? I think we should. No one is using the old HAppS code, so references are just misleading. Agreed. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Lambda-case / lambda-if
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 10/2/10 15:27 , Jan Christiansen wrote: You can use a similar approach for case expressions ; ) There are several better (that is, not using unsafePerformIO) versions at http://haskell.org/haskellwiki/Case . - -- brandon s. allbery [linux,solaris,freebsd,perl] allb...@kf8nh.com system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH -BEGIN PGP SIGNATURE- Version: GnuPG v2.0.10 (Darwin) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAkynmNsACgkQIn7hlCsL25XbOgCfdjFrXdR3PWJvPUif7VVfZZak lOcAoMpp6l1+XOxU6vwCT+sgLI94l3Kx =+gFp -END PGP SIGNATURE- ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] CCC MyType
On Fri, Oct 01, 2010 at 01:18:29PM +0200, Lafras Uys wrote: -BEGIN PGP SIGNED MESSAGE- Hash: SHA1 I can now find explicit bindings for apply and curry, however not for uncurry. The type signature for uncurry introduces a new type constructor (=), uncurry :: = a (Exp = b c) - = (Product = a b) c I'm not sure what the meaning of (=) is? If someone could provide some pointers, I would be much obliged. Where did you get these type signatures from? It seems most likely to me that the = is just a typo. -Brent ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: Non-existing types in existential quantification?
Christopher Done wrote: On 1 October 2010 15:27, Henning Thielemann lemm...@henning-thielemann.de wrote: Given the following code, that is accepted by GHC: data Exist = forall a. Exist a exist :: Exist exist = Exist undefined What type has the 'undefined' ? I think its type is `a'. So far I assumed that at runtime all objects have a concrete type. This seems not to be true. Haskell has a static type system. This means that the type is a property of expressions in the source language, not (necessarily) something which exists at runtime. Furthermore, polymorphic types (i.e. those which contain type variables) such as Nothing :: forall a. Maybe a are no less concrete than monomorphic ones (i.e. those which do not contain type variables). It often happens that the 'same' expression has different types in different contexts, and that some of them are monomorphic, even though others are polymorphic. In this case the monomorphic type must be a substitution instance of the polymorphic one (i.e. type variables have been instatiated with (monomorphic) types). But I know of no rule that says that /all/ type variables have to be instantiated eventually. Consider the following program: main = putStrLn $ show $ length [undefined :: a,undefined :: b] A concrete type of the element in list doesn't need to be determined at runtime, or any time. a unifies with b, and that unifies with x in length :: [x] - Int. A simpler example is main = print Nothing Cheers Ben ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: happstack-ixset internals/performance (was Re: [Haskell-cafe] Inverse of HaskellDB)
Hi, Thomas. Thanks Jeremy, I just wrote up my own little analysis (below) while you were responding. I'll look for the kd-tree work; if I see discussion (and am stupid enough to heap more work onto my plate) then I might get involved. You can find the repository for the dynamic kd-tree implementation here [1]. I'm currently rewriting large parts of the core algorithms (balancing and multi key traversal) and the implementation is far from being complete/usable. Once I'm done with these changes it's time for some serious benchmarking. The kd-tree implementation does seem to scale, as the last working version outperformed Data.Map w.r.t. space and time when considering large data sets (~100 elements). For single-key queries on small data sets, however, IxSet is currently still faster while memory consumption is about the same. I think the main advantage of using a kd-tree vs multiple Data.Maps, is that a query involving multiple keys can still happen in O(log n) time, as the tree needs to be traversed only once. Also, when an element is modified, most of the m Data.Maps need to be rebuilt (i.e. O(m*n*log n)) because the indexing information might be out of date. (This might have been optimized in recent versions of happstack-ixset.) For the kd-tree we can get away with rebalancing a subtree of some size k which takes O(k*log k) time. Peter [1] http://darcs.monoid.at/kdtree/ - So another glance tells me there is a list of maps (one element for each index method) and it uses Data.Map under the hood. So I have O(m lg n) where m is the number of index methods and n is the number of elements. Space wise, I think Data.Map takes up 6 words per Bin constructor (1 for the constructor, 1 for the 'Size' and one for the pointer indirection for each additional field), so the space is 6 * n * m * w where w is the word size. This means indexing by 5 methods for 1M entries takes about 256MB, assuming 28B per entry that's 28MB of data + 256 indexing ~ 282MB needed. Indexing my imaginary 1B points by user,date,lat,lon is 6 * 2^30 * 4 * 8 - or about 192 GB of indexing + 28GB of data for 220GB total. Obviously I shouldn't be talking about keeping a live data set of 28GB in memory let alone indexing it all, but I was just curious about the ratio (220MB for 1M points, which is just one heavy user). On Sat, 2010-10-02 at 14:09 -0500, Jeremy Shaw wrote: In the current version of IxSet, the performance of querying on just the Lon would be essentially the same as if you just had a Data.Map Lon Point. But the queries on the second index are current not so great. There is work in progress to rewrite the internals of IxSet to be based on a kd-tree, in which case your query should be pretty efficient. So, that answer is pretty vague :) I am in the process of wrapping up happstack 0.6 which has focused on fixing some performance issues with happstack-server, and refactoring the code so that user API and internals are more clearly separated and better documented. happstack 0.7 is all about happstack-state. A key aspect will be nailing down some solid performance benchmarks instead of vague hand waving :) The numbers you give are certainly within the scope of what we would like 0.7 to be able to handle. Also, I should note that happstack-state and happstack-ixset are independent from each other. You can easily use something other than IxSet to store your points and still use happstack-state. - jeremy On Fri, Oct 1, 2010 at 1:53 PM, Thomas M. DuBuisson thomas.dubuis...@gmail.com wrote: That is pretty close to how it would look using happstack-state. Here is a complete, runnable example which defines the types, a query, creates/initializes the database, performs the query, and prints the results. [snip] How is data stored in Happstack.State? I see the Component instance uses fromList from happstack-ixset but can't find any information on the algorithm used or its efficiency (computationally or wrt space). If making this more concrete helps then here is a possible use: == GPS Points == I have a GPS logger that logs every 10 seconds when I jog. Jogging for an hour a day for the past 180 days has resulted in 64k points. Pretending I hosted a site for joggers (and all points were in the same DB) I could easily result in a billion points ( 20K users). Would happstack-ixset code in the form points @ (Lon -120) @ (Lon -125) @ (Lat 45) @ (Lat 50) perform reasonably? Cheers, Thomas ___ 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] Lambda-case / lambda-if
On 10/2/10 3:13 PM, Christopher Done wrote: There's nothing more annoying than having to introduce intermediate bindings when you're going to immediate pattern match against it immediately and never use it again. It's both annoying to have to think of a variable name that makes sense and is not in scope or will be in scope, and annoying to type it out, and it's just ugly. This is *not* a special-case, it happens all the time and it's one of the few things in the syntax I wish could be updated. +1. In Mark Jones' new language, Habit, they have monadic versions of case and if-then-else for precisely this reason. I'm not sure if the (case of {...}) syntax is the best one to use for this feature, but I'd love to get rid of those intermediate names for monadic case expressions. -- Live well, ~wren ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: happstack-ixset internals/performance (was Re: [Haskell-cafe] Inverse of HaskellDB)
Hello, Check out these threads: http://groups.google.com/group/happs/browse_thread/thread/23d92e45c99f88b1 http://groups.google.com/group/happs/browse_thread/thread/0b0d0a9158c3ad73 There is nothing inherently wrong with keeping 28GB of real data in memory. It depends largely on what you are trying to optimize for.. For personal hobby projects, the cost of hosting the project seems to be the biggest expense that people are concerned worth. (Which is quite reasonable). As a result people are willing to increase development time, and sacrifice performance in order lower hosting costs. (Also reasonable). For commercial projects, the costs look different. For example, if buying a server with 1TB of RAM (around $80,000 these days) means they can hire one less developer (at $150,000/year when you look at total cost of salary, benefits, etc), then that is a savings of $70,000. Additionally, in RAM storage provides much more predictable performance. If you have ever attempted to use a site like reddit after its memcached servers have been reset, it is clear how bad the penalties for hitting disk are. RAM is significantly faster and than disk and has no seek time. RAM can achieve 100-1000x less latency and higher throughput. Facebook reportedly keeps as much as 80-90% of their working dataset in memcached. In 2008 they had 28TB of memcached servers. No idea what they are up to now (http://www.facebook.com/note.php?note_id=39391378919). Of course, there are datasets which are simply too big to be stored in RAM. For example, google's search index. I am not that familiar with their approach, but I believe they go the opposite extreme. They likely assume that every query is going to hit the disk, and optimize the system so that it can provide acceptable response even if nothing is cached ? (I am totally guessing here). The focus of the new IxSet internals is to help bring the indexing overhead ratio down (and increase speed at the same time). There are also some ideas, but not code, for how to build an IxSet-like structure which stores the keys in RAM, but can store the values of disk. That would, hopefully, give you the ease of use of IxSet, but with lower memory requirements if your keys are significantly smaller than the total value payload. The trade off being that you get back into the ugly work of disk seeks :) There was also some experimental work done where the values were stored in RAM, but in their serialized byte format, under the assumption that the serialized format is a lot more compact than the normal representation. The trade off is that the values must be deserialized everytime they are used, which requires more CPU. A more complex version could be imagined, where the deserialized version is cached for some period of time. Whether that is actually beneficial can only be determined empirically I think... So, clearly happstack-state is not the optimal choice for all haskell web applications. And that is why it is a completely independent from happstack-server. We do want to allow people to pick the best choice for their application. Of course, if we want to provide off-the-shelf components like a user account system -- then eventually we have to nail down some specifics, such as the persistence layer. But those choices would only apply to code that wants to use those optional components. At the same time, happstack-state is a very interesting and challenging library to work on. The recent rise in popularity of things like redis seems to validate happstack-state somewhat. - jeremy On Sat, Oct 2, 2010 at 3:09 PM, Thomas M. DuBuisson thomas.dubuis...@gmail.com wrote: Thanks Jeremy, I just wrote up my own little analysis (below) while you were responding. I'll look for the kd-tree work; if I see discussion (and am stupid enough to heap more work onto my plate) then I might get involved. Oops, didn't send... Cheers, Thomas - So another glance tells me there is a list of maps (one element for each index method) and it uses Data.Map under the hood. So I have O(m lg n) where m is the number of index methods and n is the number of elements. Space wise, I think Data.Map takes up 6 words per Bin constructor (1 for the constructor, 1 for the 'Size' and one for the pointer indirection for each additional field), so the space is 6 * n * m * w where w is the word size. This means indexing by 5 methods for 1M entries takes about 256MB, assuming 28B per entry that's 28MB of data + 256 indexing ~ 282MB needed. Indexing my imaginary 1B points by user,date,lat,lon is 6 * 2^30 * 4 * 8 - or about 192 GB of indexing + 28GB of data for 220GB total. Obviously I shouldn't be talking about keeping a live data set of 28GB in memory let alone indexing it all, but I was just curious about the ratio (220MB for 1M points, which is just one heavy user). On Sat, 2010-10-02 at 14:09 -0500, Jeremy Shaw wrote: In the current version of IxSet, the performance of querying on just the
[Haskell-cafe] Re: Lambda-case / lambda-if
Thanks to everyone who replied - it looks like this feature is enough in demand that GHC HQ may want to accept it. I've created a ticket at http://hackage.haskell.org/trac/ghc/ticket/4359 On 2 October 2010 14:23, Max Bolingbroke batterseapo...@hotmail.com wrote: Hi Cafe, I implemented the proposed Haskell' feature lambda-case/lambda-if [1] during the Haskell Implementors Workshop yesterday for a bit of fun. The patches are online [2, 3]. The feature is demonstrated in this GHCi session: $ inplace/bin/ghc-stage2 --interactive -XLambdaCase GHCi, version 7.1.20101002: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking ... done. Prelude (if then Haskell else Cafe) False Cafe Prelude (case of 1 - One; _ - Not-one) 1 One Prelude :q Do you like this feature and think it would be worth incorporating this into GHC? Or is it too specialised to be of use? If there is enough support, I'll create a ticket and see what GHC HQ make of it. Max [1] http://hackage.haskell.org/trac/haskell-prime/ticket/41 [2] http://www.omega-prime.co.uk/files/LambdaCase-Testsuite.patch [3] http://www.omega-prime.co.uk/files/LambdaCase-Compiler.patch ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: A parsec question
On Wed, Sep 29, 2010 at 1:01 PM, Daniel Fischer daniel.is.fisc...@web.de wrote: On Wednesday 29 September 2010 19:10:22, Ben Franksen wrote: Note the last line mentions only '}'. I would rather like to see expecting } or digit since the parser could very well accept another digit here. parsec2 did that, I don't know whether that change is intentional or accidental. I came up with a smaller example which shows a similar problem: bracket = char '{' * return () test = bracket * (bracket | return ()) * char 'a' For the input {b the error message should mention that we can take either a '{' or an 'a', however it only mentions the 'a'. However I know how to fix this one, and it doesn't fix the bug evidenced by the above program. Antoine ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] EDSL for Makefile
Thanks Emil ... yeah, that works...I was wondering what I could do to not have to mention r1 explicitly. I'll check out Neil's pdf and video now - perhaps I'll find answers there. I checked out the video - nice - but I think, understandably, since its not open source yet, not much of implementations details were mentioned. So, I have this unanswered question nagging in my head. In the example below, how can I let the makefile writer refer to the target name and dependencies. Likr Emil mentioned, I could use target r1 but I want to avoid having to mention r1. http://hpaste.org/40233/haskell_makefile_edsl -- Regards, Kashyap ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Re: Haskell web development entries on the Wiki
On Sat, Oct 2, 2010 at 10:40 PM, Christopher Done chrisd...@googlemail.com wrote: On 2 October 2010 22:13, Michael Snoyman mich...@snoyman.com wrote: I understand the advantages to splitting into multiple pages, but on the other hand it *does* make it more difficult to locate information. It does? What's an example? I'll fix it. It was more of a general comment. When everything's on the same page, I can do ctrl-f happ and find information about all the pieces of happstack. As I said, I think a search function is a good replacement. My guess is a good search function on the wiki will make that point moot. Probably! * Does pass.net still exist anywhere? Same for parallel web. I couldn't find any references to pass.net. http://www.haskell.org/haskellwiki/Web/Existing_software * Should older, unmaintained stuff (Wash, for example) be removed entirely, placed on its own page or be obviously marked as unmaintained? Yes, I think so. There are a lot of frameworks on that page that are just cluttering it up, most of them are unmaintained or don't really have a big user-base. Perhaps we should split it to Active / Recommended and Inactive / Unevaluated or something like that. If I was looking for web frameworks I'd want to know which ones were actively maintained and then *maybe* what other ones there are. It could well be two pages. Frameworks/Active or Recommended_Frameworks and then the other. I'm not sure. Thoughts, chaps? I would recommend *not* qualifying the active/recommended stuff. Maybe Frameworks and Frameworks/Inactive. I personally wouldn't want to group new, unevaluated code with inactive: I think we should give the new players the same publicity as the established products on the main page, but perhaps with a little label explaining how new/untested it is. Michael ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe