HNHacker News
TopNewBestAskShowJobs

lrichardson

114 karma · joined July 10, 2013

intelligiblebabble.com
submissionscomments
lrichardson··on Functional JavaScript, Part 4: Function Currying
I was thinking about whipping together a perfJS for the curry function and putting it in the post but ended up not... I might make one and post it back here.

---

UPDATE: I made this jsperf: http://jsperf.com/curry-function

There might be better things to test, but the results were actually unexpected. Currying "manually" with nested functions is actually slower than using my "curry" function.

As I mentioned in my post, if you are touching the DOM at all, I really doubt you will see much of a performance hit from using this...

lrichardson··on Functional JavaScript, Part 3: apply, call, and the arguments object
I guess I didn't mean for it to be misleading, but I wrote the example like I did on purpose to show that in OCaml, the arguments are curried by default... that there is no need to have the `fun` keyword 3 times.

The misleading part was probably naming the first function "uncurried"... the point of the example was to show that they were both curried.

I'll try to make this more clear in my post. Thanks.

lrichardson··on Functional JavaScript, Part 3: apply, call, and the arguments object
Yeah, I think I sometimes weave back-and-forth. I try to avoid thinking about "micro-optimizations", but can't help myself. As I'm writing this series I'm compiling together a small and opinionated library that uses a lot of these concepts, and I am tending to use native methods, for loops, while loops etc. in favor of performance....

but I should probably stop that and instead favor the clean code following the very principles they are there to promote! One of my points was that performance doesn't really matter here anyway.

Thanks for pointing out. I might update a couple spots.

lrichardson··on Functional JavaScript, Part 3: apply, call, and the arguments object
Yes and no.

Some of this is that JavaScript is just not very well equipped to do functional programming. For instance, the nesting of functions in JavaScript is not only verbose to write, it also introduces a lot of noise in the code.

One pretty simple/obvious setback for JavaScript is that declaring an anonymous function (or a lambda) entails quite a few characters. In ES6, [this will change with the introduction of "Arrow Functions"][2], but that's not going to be a cure-all by any means.

Languages geared more towards the functional edge will handle things like curried higher order functions almost without you realizing it. For instance, taking an excerpt from my next post in the series (still unpublished):

    var uncurried = function (a, b, c) {
        // do something with a, b, and c
    };

    var curried = function(a) {
        return function (b) {
            return function (c) {
                // do something with a, b, and c
            };
        };
    };
There we have two ternary functions (3 arguments), but the first one is uncurried (how you would expect it in javascript), and the second one is manually written in a curried fashion.

Some programming languages, such as Haskell and OCaml, have function currying built into the language. What that means is that, technically, every function is a function of one argument, and one argument only. Syntactically, however, they may make this restriction almost unnoticable.

For instance, in OCaml, one could write the two functions above like:

    let uncurried = fun a b c ->
        // (* do something with a, b, c *)

    let curried = fun a ->
        fun b ->
            fun c ->
                // (* do something with a, b, c *)
The difference, however, is that in OCaml these are exactly the same thing. In OCaml, no functions have multiple arguments. However, invoking curried functions syntactically looks the same as what one would expect invoking a function with multiple arguments would be. To call the functions above we would write:

    uncurried foo bar baz
    curried foo bar baz
Whereas in JavaScript, we have the obvious difference:

    uncurried(foo, bar, baz);
    curried(foo)(bar)(baz);
Many would argue that the readability of the former is much better than the latter.

---

Anyway, what I am trying to build up to in this series is building a set of tools to make writing code like this a little more fluid in JavaScript than native JavaScript would allow.

This goes back to my example in [Part 1][1], where I show an underscore example:

    var firstTwoLetters = function(words){
        return _.map(words, function(word){
            return _.first(word, 2);
        });
    };
Which, the exact same thing can be represented "my way" with:

    var firstTwoLetters = map(first(2));
I would argue that this is much more readable, and perhaps you would agree?

  [1]: http://tech.pro/tutorial/1953/functional-javascript-part-1-introduction
  [2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/arrow_functions
lrichardson··on Functional JavaScript, Part 3: apply, call, and the arguments object
That is great feedback. I am actually working on creating a "functional" version of the 2048 game, along with my own implementation of the AI solver, as part of this series. Kinda goofy, and maybe not a "real world" situation as much, but should at least show the concepts being applied.

I also very much recommend this video by Brian Lonsdorf, titled "Hey Underscore, You're Doing It Wrong!:

https://www.youtube.com/watch?v=m3svKOdZijA

lrichardson··on Functional JavaScript, Part 3: apply, call, and the arguments object
Having read the book, I can definitely recommend it. Along with the book, Braithwaite created [allonge.es][1], a functional js library which follows much more closely how I would create a FP utility library in JS (versus, something like lo-dash or underscore).

  [1]: https://github.com/raganwald/allong.es
lrichardson··on Functional JavaScript, Part 3: apply, call, and the arguments object
author of the article here: this is part 3 of what will likely be a 6+ part series... as a result, this post is still sort of "laying the foundation", before getting to some of the "fun stuff".

In any event, would love to hear any feedback!

lrichardson··on Camperoo (YC W14) Helps Parents Find and Book Summer Camps, Activities for Kids
I remember being pitched this idea at START pitch day - I really think it is a great idea.

I agree with the comments above: "OpenTable for camps" is a much better (or at least more recognizable) comparison than Expedia.

Congratulations on becoming part of YC 14!

lrichardson··on In what areas are the massive fortunes of the future going to be made?
driverless cars.

I think google is years ahead of everyone else here, and it will be a product that will be high price, high margin. And the market is huge.

I really don't see how google could walk away from that one without gobs of cash in their pockets.

lrichardson··on Exceptions (2003)
this is honestly the most annoying thing about go for me. Really hard to do a quick google search for an answer to something!
← PreviousPage 2 of 2