Sorry to nitpick, but I got hung up right at the beginning with his "truthy" function. It returns true on values such as NaN, zero, or an empty string. I don't think I'm alone in considering those to be "falsy" values, for example: http://www.sitepoint.com/javascript-truthy-falsy/
Fun.js – Just a sketch
11–20 of 22 posts
Re: Fun.js – Just a sketch
#12What would you say are the skills required to fully understand this?
It's a pretty fast paced intro to a lot of functional programming concepts. You can read a guide like learnyouahaskell.com, which will take you on a gentler ride.
Re: Fun.js – Just a sketch
#13A lot of these examples are wrong... function double(n) { return 2*n; } map(double, [1,2,3]) //=> [1, 4, 9] should be => [2, 4, 6] function greaterThan(l, r) { return l > r; } greaterThan(5, 100); //=> true should be => false maybeGT(5)(10000000); //=> false Based on your earlier declaration of greaterThan this result is actually correct. The curried application ordering is also correct and flip is unneeded. schonfin…
greaterThan(100, 5);
//=> true
That is, l is greater than r, and to then properly curry the arguments do need to be flipped such that maybeGT(5) results in a function that returns whether the argument is greater than 5.Re: Fun.js – Just a sketch
#14A lot of these examples are wrong... function double(n) { return 2*n; } map(double, [1,2,3]) //=> [1, 4, 9] should be => [2, 4, 6] function greaterThan(l, r) { return l > r; } greaterThan(5, 100); //=> true should be => false maybeGT(5)(10000000); //=> false Based on your earlier declaration of greaterThan this result is actually correct. The curried application ordering is also correct and flip is unneeded. schonfin…
Actually, I think the original intent regarding greater than was: greaterThan(100, 5); //=> true That is, l is greater than r, and to then properly curry the arguments do need to be flipped such that maybeGT(5) results in a function that returns whether the argument is greater than 5.
var gtThreshold = gt(100);
And then: filter(gtThreshold, array);
This is nicely fluent I would say.Re: Fun.js – Just a sketch
#15A lot of these examples are wrong... function double(n) { return 2*n; } map(double, [1,2,3]) //=> [1, 4, 9] should be => [2, 4, 6] function greaterThan(l, r) { return l > r; } greaterThan(5, 100); //=> true should be => false maybeGT(5)(10000000); //=> false Based on your earlier declaration of greaterThan this result is actually correct. The curried application ordering is also correct and flip is unneeded. schonfin…
Re: Fun.js – Just a sketch
#16Earlier quoted context omitted.
Technically the are JS falsey, but I choose not to treat them that way. I rarely want to treat the result of a calculation as a boolean condition. However, I often want to know if a calculation isNaN or isEmpty. Just because something is falsey doesn't mean it should be treated that way universally.
Right on, I get that, but truthy(NaN) and truthy(5) both return true, so you still don't know if the calculation isNaN. Btw, I should have said first: I love the article in general and it's great to see these techniques becoming more mainstream in javascript. Thank you!
var ans = someCalculation(x,y);
if (truthy(ans) && !isNaN(ans))
//do something
else
//do something else
The point being I like to dispatch conditions on boolean results of certain properties of my results rather than the result directly. It helps me to keep my sanity.Thanks for the kind words BTW. :-)
Re: Fun.js – Just a sketch
#17What would you say are the skills required to fully understand this?
Possibly not too high. Try using map, filter, and reduce on some example problems and you'll pick it up fairly quickly. Project Euler makes for decent fodder. When you've successfully managed to apply them then try rewriting the functions (delete the implementation you are using - such as the library above - and rewrite it from scratch).
Here's my recommendation: http://www.haskell.org/haskellwiki/H-99:_Ninety-Nine_Haskell...
Re: Fun.js – Just a sketch
#18Re: Fun.js – Just a sketch
#19Very interesting post but I'm having trouble with one thing. pipeline(5) returns 5. When I try to follow that path, I get to this: reduce(function(l,r) { return r(l); }, seed, funs) with seed=5 and funs=[] (an empty array). How does that reduction evaluate to 5? In other words, what is "r(l)" when l=5 and r=the first member of an empty array?
Re: Fun.js – Just a sketch
#20Just a note - forEach doesn't work in IE8. I wonder at what point can we stop caring about that?
Focusing on modern browsers and shimming the old ones is the way to go, IMHO