News aggregator

Noam Lewis: In Python, don’t initialize local variables unnecessarily

Planet Haskell - Tue, 06/23/2015 - 12:07pm

A common pattern:

def foo(): x = some value # but do we need this? (short answer: no) if something: # ... do stuff ... x = 'bla' else: x = 'blo'

The variable x is being initialized before the if/else, but the intention of the programmer is that its value will actually be determined by the if/else itself. If somebody later comes around and mistakenly removes one of the assignments (inside ‘if’ or ‘else’), no runtime error will occur and x will remain initialized to a probably wrong value.

Leaving out the initialization is better – in that case, forgetting to set x in one of the branches will cause an UnboundLocalError:

>>> def foo(): ... if False: ... x = 0 ... return x ... >>> foo() Traceback (most recent call last): File "", line 1, in File "", line 4, in foo UnboundLocalError: local variable 'x' referenced before assignment

Errors are good! (when they flag buggy code)

Now, what if we also have an x declared in the global scope? Because of how Python handles variable scope, the error will still happen (which is good).

>>> x = 1 >>> def foo(): ... if False: ... x = 0 ... return x ... >>> foo() Traceback (most recent call last): .. UnboundLocalError: local variable 'x' referenced before assignment

Summary: In Python, don’t initialize variables until you know what value to assign to them.

Categories: Offsite Blogs

Ghc 7.10.1 Alpine packages

Haskell on Reddit - Tue, 06/23/2015 - 11:22am

Ok so I figure I might as well release this to the world. It works decently enough for my purposes the past week or so.

So voila, ghc 7.10.1 alpine packages. I'm pestering the Alpine developers to get this into the testing repository proper but in the interim, have fun. Note this is compiled with -O2, when you recompile ghc a lot binary size starts to seem a minor problem.

The readme should cover things I found/know about. The examples directory has everything you'd need to use these packages in a Dockerfile. The stage1/2/3 directories have a mostly working setup on how I got to native packages within alpine linux.

Consider it alpha grade though. I can compile things like idris with it and they work. But I haven't validated its correct. Only that things compile and don't segfault straight away.

Also not entirely sure if having a ghc/ghc-dev package split makes sense to be honest.

Next up on my list is automating rebuilds for cabal-install and ghc itself so that when 7.10.2/next cabal version is out I'm set to update this jazz.

Also many thanks to everyone in #ghc that helped me with this as well as anyone I may be missing/forgetting about. Have to go help debug a problem.


submitted by saudade
[link] [5 comments]
Categories: Incoming News

FP Complete: stack 0.1 released

Planet Haskell - Tue, 06/23/2015 - 11:00am

A few weeks ago, we announced the first public beta of stack, a new build tool for Haskell. Since then we've seen a huge amount of work on stack: code contributions, feature requests, bug reports, and design discussions. In other words, the response we've had from the community has been amazing. Thank you for helping us push forward with improved Haskell tooling.

Today we're announcing a new milestone: we believe that stack is now stable enough to be the standard build tool for most Haskell development. We're taking the beta label off of stack, and recommending people dive in. Please keep in mind that stack is still young software, and there are likely corner cases that haven't been worked out fully. However, the feedback we've received from other users has indicated that stack is ready. The stack team itself (both inside and outside of FP Complete) has been using stack for months now as its primary tool. And at FP Complete, we've already moved our biggest projects over to it.

Relevant links:

One question which I've personally held off on addressing until now is a direct comparison between stack and other build tools, cabal being the most obvious comparison. Expect a blog post on the subject in the near future. For now, my recommendation is: try out stack, and see if you like it.

Bringing Haskell to the masses

While stack started with the needs of existing Commercial Haskell users, the goal we've always had in mind for it is a tool that lowers the barrier to entry for non-Haskellers. As we've discussed before, FP Complete has done quite a bit of research on this topic, and the data shows that build tool issues have been an obstacle to adoption. We want stack to solve that, and we want your help.

Firstly: keep doing what you've been doing! Using stack, testing it, providing feedback, reporting bugs; all of these make stack better for both our existing community and for newcomers. But the next step is marketing Haskell outside of our community. All of us Haskellers already know how wonderful a language Haskell is. Let's send a clear message to the rest of the world that it's time they try Haskell. stack's aim is to remove those initial barriers. But now we need to tell people what Haskell has to offer.

If you're interested in getting involved in this kind of a push, please join and discuss on the Commercial Haskell mailing list. There's no preexisting formula for how this should be done. But the basic idea I have right now is:

  • Give users a clear message on how to get up and running with Haskell based on stack
  • Give a good example of a strength Haskell has
  • Make it easy for people to play around with the concept with some sample code

I'm sure others will have better ideas than I on how to accomplish this. If you want to see Haskell take off as not only a successful, powerful language (which it is now), but as a more popular language too, come get involved!

Categories: Offsite Blogs

Haskell Generics and Java Reflection

Haskell on Reddit - Mon, 06/22/2015 - 7:53pm

I stumbled on Haskell's Generics and it kind of reminds me of Java's Reflection mechanism. Not exactly the same mechanics in play, but both are trying to "solve" the same problem. Did I get it right?

submitted by evohunz
[link] [6 comments]
Categories: Incoming News

RebindableSyntax on individual do blocks

haskell-cafe - Mon, 06/22/2015 - 7:39pm
I have a program that uses both monads and indexed monads, and I'd like to use do-notation for each in the same source file. Is there a way to rebind syntax for only the do blocks that make use of an indexed monad? Thanks, Mark _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe< at >
Categories: Offsite Discussion

Functional Programming and Safety

Haskell on Reddit - Mon, 06/22/2015 - 6:27pm

In general, does what Functional Programming and Haskell teach result in safer code in other imperative or procedural programming languages? (less bugs etc)

submitted by pragm
[link] [19 comments]
Categories: Incoming News

Turning Monoids into Categories

haskell-cafe - Mon, 06/22/2015 - 5:51pm
Is there a newtype defined in some normal sort of place for turning Monoids into Categories? I'm looking for something like this: newtype ConstConst m a b = ConstConst m instance Monoid m => Category (ConstConst m) where id = ConstConst mempty ConstConst x . ConstConst y = ConstConst (x <> y) Thanks, David Feuer
Categories: Offsite Discussion

Powerset implementation - help with IO system

Haskell on Reddit - Mon, 06/22/2015 - 3:25pm


Im doing some cold-golf challenges (program should be as short as possible) and im stuck now. I have 3 powerset implementations :

powerset [] = [[]] powerset (x:xs) = xss ++ map (x:) xss where xss = powerset xs main = print $ powerset([1,2]) import Control.Monad(filterM) p = filterM(const[True,False]) main = p[1,2] import Data.List; main = (readLn :: IO [Integer] ) >> = print . subsequences

For now it takes an input in this form : [1,2,3]. Any advice how to change it so it takes every number in list in this form :

1 <enter>

2 <enter>

3 <enter>

IO system of haskell is super hard for me, so can someone show me how to make input possible in first and second function ?

Extra question IS it possible to change those function so they compute power set when as one parameter I will pass [1,2] ?

submitted by Cosaquee
[link] [5 comments]
Categories: Incoming News

ANNOUNCE: fgl-arbitrary

General haskell list - Mon, 06/22/2015 - 2:21pm
I've just released the first version of fgl-arbitrary [1], which provides Arbitrary instances for fgl graphs for use with QuickCheck. Also provided are some wrapper newtypes to produce specific types of graphs, and also the ability to generate just valid node and edge lists for use with other graph-like data structures. [1]:
Categories: Incoming News

In what ways does Haskell support intersection and union types?

Haskell on Reddit - Mon, 06/22/2015 - 12:16pm

I read that there was some work about adding support for intersection and union types done in ML (refinement intersection types) and also work on unrestricted intersection types.

Also, I am aware about LiquidHaskell and Dana Xu's work.

However, how much of that can be used in Haskell today (with 7.10)? Anything planned for the future?

Are Haskell's typeclasses one implementation of refinement types?

EDIT: A quote about using intersections and unions for overloading: "In its present form, this idiom is less powerful than type classes (Wadler and Blott 1989)".

Indeed, adding multiple class constraints creates an intersection (Eq a, Show a) => ... means having both Eq and Show.

submitted by mallai
[link] [17 comments]
Categories: Incoming News

Free monads?

Haskell on Reddit - Mon, 06/22/2015 - 11:24am

I would like to understand what a free monad actually is, and who invented the idea, and when.

submitted by concatintersperse
[link] [3 comments]
Categories: Incoming News

Philip Wadler: How badly will Audible misuse my contact list?

Planet Haskell - Mon, 06/22/2015 - 10:54am

In today's world, where our books, music, and photos belong to the Cloud rather than to ourselves, one problem we face is commercial concerns insisting on increased access to personal data.

I received the following note from Audible:

It looks like you may have an older version of Audible app installed on your device which needs to be updated before 6/30/15 to ensure that you enjoy uninterrupted access to your library.
Option 1: Continue to use the older version of the app.If you receive an error message when you attempt to sign in, look in your emails for a password that you will need for sign in.
Option 2 (Recommended): Upgrade to the latest version....

Warmest Regards,
The Audible TeamWhat the note doesn't mention is that updating the app requires giving Audible access to my contacts list.

Does anyone know how Audible is using the contact list? Worst case scenario is they email advertisements to my friends in my name, telling them what I am currently reading.

Do customers have any legal redress? Changing the terms of service to require access to the customer's contact list is the sort of thing the law should protect against.

Categories: Offsite Blogs

Help to model similar/shrinkable records.

Haskell on Reddit - Mon, 06/22/2015 - 8:09am

I'm working on a simple PAYROLL tool to help my company. At the moment we have a matrix on sheet of paper where every member of write it's time attendance down. The payroll department process manually those sheets and feed our different system (PAYE, Accounting software) also manually. This is time consuming and error prone, so I dediced to a write a tool which allows to enter the data in a file in a "fast format" and generate different reports and csv which can be used to feed the different systems.

So far so good, I've finished the parser I need to generate the different reports/csv which are nearly the same but slightly different. Usually I have an "extensible record" problem, (.i.e how to extend a record). Today I have the opposite the "shrinkable record" problem , how to shrink it down.

The result of the parsing gives a list of Shift

data Shift = Shift { employee :: Employee , day :: Day , startTime :: Maybe TimeOfDay , duration :: Double , hourlyRate :: Double }

startTime is a Maybe because it might be on original sheet or not (people might write 08:00-12:00) or just 4.00 (for 4 hours).

The first task is to get the number of hours per employe/per day. It seems easy, just group by employee/day and aggregate everything else. The grouping is easy, that's the aggregating which causes problem : I know how to solve the problem in lots of dirty way but I haven't found a neat and practical solution.

The first thing I'm thinking is to use a Monoid and do reduce all the similar shifts using mcat. Can I write a valid instance of Monoid for Shift ? Let's focus on the mappend first.

All the employes and days are supposed to be the same (within my list) so I could cheat and just keep the first one. The start time doesn't really make any sense so I could just put Nothing or get the earliest one. Duration it's easy .Hourly rate is fine if each employe always have the same hourly rate. However it might be not the case with extra hours etc .

mempty is even more tricky. However I probably can cheat again and use a dummy Employe or even undefined and set it back at the end. That's not really satisfying.

So, first deception: Shift is not a Monoid, in fact not even a Semigroup, even though I could write it easily in SQL ... so let's try the SQL

SELECT employee, day, sum(duration) AS duration, sum(duration*hourlyRate) AS cost FROM shifts GROUP BY employee, day

That was easy, why is it so hard to do the same in Haskell ? (disclaimer : I don't want to use SQL, I just want to parse a file, and generate a CSV).

Hey, I have changed the type without noticing it (I have dropped startTime and mutate hourlyRate to cost).

So I do modelize this newtype ? Here are my options

type ShiftT = (Employee, Day, Double, Double) data Shift' = Shift' { employee :: Employee , day :: Day , duration :: Double , cost :: Double } data ShiftF f = ShiftF { employee :: f Employee , day :: f Day , duration :: Double , cost :: Double } data ShiftK k = ShiftK { key :: k , duration :: Double , cost :: Double } type ShiftEmpDay = ShiftK (Employee, Day) data Shift'' = { duration :: Double, cost :: Double } type ShiftEmpDay' = ((Employee, Day), Shift'')

etc ...(There is also a solutions using lenses and makeClassy to embed a Shift'' inside a ClassyShift)

Shift' seems fine but It's not a Monoid either, because of Employe and Day (neither than ShiftT). This is frustrating because it's the equivalent to the SQL query but their is not safe way in haskell to guarantee that the Employee/Day will be unique. ShiftK and ShiftF can be a Monoid providing k or f are. ((Employee, Day), Shift'', is not but Shift'' this solution is sort of the easier to implement.

Writting I probabaly would go now for ShiftK, but which approach would you recommend (knowing that once I've done that I'll need also to shrink it again and discard day to get the number of hours/cost per week) ? Is there a better solution ?

submitted by maxigit
[link] [2 comments]
Categories: Incoming News

Am I the only one dissatisfied with the new Hayoo?

Haskell on Reddit - Mon, 06/22/2015 - 6:55am

I always preferred Hayoo to Hoogle as my go-to haddock search engine. But after the new upgrade I feel that it is just broken.

Example given, searching the documentation for Data.Sequence:

Now I see that "seq" and "sequence" are quite overloaded here ... but seeing that there are results like Bio.Core.Sequence and Sequence :: ASN1ConstructionType on the first page I just can wonder. The third try is especially dissatisfying ... after spelling out the complete name of the thing I am searching for I don't get any link to the correct module.

I feel that compared to the "old hayoo" this is just wrong ... is there a good reason for this?

submitted by goliatskipson
[link] [23 comments]
Categories: Incoming News

Daniil Frumin: Darcs binaries for OSX with Homebrew

Planet Haskell - Mon, 06/22/2015 - 6:33am

Recently I’ve updated my Darcs homebrew build to Darcs 2.10. You can install it with

brew install

The formula contains a context (--exact-version) and it is a static binary.

Tagged: darcs, haskell, homebrew
Categories: Offsite Blogs

Mark Jason Dominus: My week at Recurse Center

Planet Haskell - Mon, 06/22/2015 - 4:49am

In late April I served a residency at Recurse Center, formerly known as Hacker School. I want to write up what I did before I forget.

Recurse Center bills itself as being like a writer's retreat, but for programming. Recursers get better at programming four days a week for three months. There are some full-time instructors there to help, and periodically a resident, usually someone notable, shows up for a week. It's free to students: RC partners with companies that then pay it a fee if they hire a Recurser.

I got onto the RC chat system and BBS a few weeks ahead and immediately realized that it was going to be great. I am really wary about belonging to groups, but I felt like I fit right in at RC, in a way that I hadn't felt since I went off to math camp at age 14. Recurse Center isn't that different from math camp now that I think about it.

The only prescribed duty of a resident is to give a half-hour talk on Monday night, preferably on a technical topic. I gave mine on the history and internals of lightweight hash structures in programming languages like Python and Perl. (You can read all about that if you want to.)

Here's what else I did:

  1. I gave a bunch of other talks: two on Git, one on calculating with continued fractions, one on how the Haskell type inferencer works, one on the topology of data types, one on the Unix process model, one on Alien Horrors from the Dawn of Unix. This was too many talks. I didn't have enough energy and time to prepare all of them properly. On the other hand, a lot of people were very complimentary about the talks and said they were very glad that I gave so many. Also, giving talks is a great way to get people familiar with you so that they won't be shy about talking to you or asking you to work with them. But I think I'll cut it down to one per day next time.

  2. Alex Taipale was inspired by my hash talk to implement hashes synthetically in Python, and I paired with her on that for the first part and reviewed her code a couple of times after. It was really fun to see how she went about it.

  3. Libby Horacek showed me around the text adventure game she wrote in Haskell. I had the first of several strokes of luck here. Libby had defined an input format to specify the room layout and the objects, and I observed that it was very similar to Asherah, a project that another Recurser, Michelle Steigerwalt, had done a couple of years before. I found this out because I read everyone's self-posted bio ahead of time and browsed the interesting-sounding links.

  4. Aditya Mukerjee was implementing Git in Go. He wanted help deciphering the delta format. Later I paired with Aditya again and we debugged his implementation of the code that expanded the deltas back into complete files. I hadn't known any Go but it's easy to pick up.

  5. Geoffrey Gilmore had read my ancient article on how to write a regex matcher. He had written his own implementation in Scala and wanted to show it to me. I didn't know any Scala but the code was very clear. Geoffrey had worked out a clever way to visualize the resulting finite automaton: his automaton object had a method that would dump out its graph in the "dot" language, and he could feed that to Graphviz to get it to draw the graph.

  6. I had a conference with Ahmed Abdalla and Joel Burget about SML. The main question they wanted me to answer: Why might they want to look at SML instead of Haskell? This was a stroke of luck: I was unusually well-prepared to answer this question, having written many thousands of lines of SML since about 1993. My answer was unequivocally that there was no reason, SML was obsolete, because it had big problems which had never been solved, and Haskell had been introduced in part to solve, avoid, or finesse these problems.

    For example, nobody knows how to incorporate references into a Hindley-Milner type system. SML has tried at least three methods for doing this over the years. They all suck, and none of them work right. Haskell avoids the whole issue: no references. If you want something like references, you can build a monad that simulates it locally.

    I could probably write a whole blog article about this, so maybe another time.

  7. Libby wanted to pair with me again. She offered me a choice: she was building an e-reader, controlled by a Raspberry Pi, and mounted inside an antique book that she had hollowed out. I would have been willing to try this, although I didn't know anything about Raspberry Pi. But my other choice was very attractive: she was reviving KiSS, an ancient Windows paper-doll app that had been current in the 1990s. people had designed hundreds or thousands of dolls and costumes, which were all languishing because nobody wanted to run the app any more. She wanted to reimplement the dress-up program in Javascript, and port the doll and clothing cels to PNG files. Here I had another stroke of luck. I was already familiar with the program, and I think I have even been into its source code at some point.

    Libby had found that Gimp could load a KiSS cel, so we looked at the Gimp source code to figure out the file format. She had been planning to use libpng to turn the cel into a PNG, but I showed her a better way: convert it into a PPM file and feed to to ppmtopng. This saved a lot of trouble! (I have written a little bit about this approach in the past.) Libby hacked in the Gimp code, grafting her PPM file writing code into the Gimp cel reading code in place of Gimp's internal pixmap operations. It worked!

  8. I talked to Chris Ball about his GitTorrent project. Chris wants to make a decentralized github that doesn't depend on the GitHub company or on their technical infrastructure. He spent a long time trying to make me understand why he wanted to do the project at all and what it was for. I think I eventually got it. It also transpired that Chris knows way more about BitTorrent than I do. I don't think I was much help to Chris.

  9. Jesse Chen paired with me to fix the layout problems that have been troubling my blog for years. We redid the ancient table-based layout that I had inherited from Blosxom ten years ago, converting it mostly to CSS, and fixed a bunch of scrolling problems. We also fixed it to be legible on a phone display, which it previously wasn't. Thanks Jesse!

  10. I had a discussion with Michelle Steigerwalt about big-O notation and how you figure out what an algorithm's big-O-ness is, either from counting lines in the source code or the pseudocode, or from running the algorithm on different-size inputs and timing it. It's fun that you can do the static analysis and then run the program and see it produce the results you predicted.

There was a lot of other stuff. I met or at least spoke with around 90% of the seventy or so Recursers who were there with me. I attended the daily stand-up status meetings with a different group each time. I ate lunch and dinner with many people and had many conversations. I went out drinking with Recursers at least once. The RC principals kindly rescheduled the usual Thursday lightning talks to Monday so I could attend. I met Erik Osheim for lunch one day. And I baked cookies for our cookie-decorating party!

It was a great time, definitely a high point in my life. A thousand thanks to RC, to Rachel Vincent and Dave Albert for essential support while I was there, and to the facilitators, principals, and especially to the other Recursers.

Categories: Offsite Blogs