BTW. Interesting to read what others have done in this area:

http://osteele.com/sources/javascript/functional/
http://ejohn.org/blog/partial-functions-in-javascript/

Cheers,

/Per

On Thu, Dec 18, 2008 at 9:32 PM, Per Cederberg <cederb...@gmail.com> wrote:
> Thanks for the clarification, Bob!
>
> Regarding the functions in questions I think other names might be in
> place, to avoid misleading interpretations. What we're really doing
> here is attempting to patch the poor JavaScript syntax and/or standard
> library for function calls (i.e. call, apply, arguments and others).
>
> The current MochiKit work-around for this is the excellent bind()
> function (in its many incarnations). But it still has weaknesses,
> since it doesn't allow us to do any of the following cool things:
>
> 1. Use the call-time 'this' object as an argument to the function (can
> only be used as the object). If we had this, the "currying" mentioned
> here would strictly be a version of bind().
>
> 2. Leaving gaps for call-time arguments in the list arguments set at
> bind-time. Currently call-time arguments can only be appended to the
> argument list.
>
> 3. Perform reordering of arguments. Typically inverse two arguments,
> like in the startsWith discussion.
>
> 4. Perform random argument transformation. Using an array as the
> argument list or vice versa. Or adding automatic flattening to
> arguments.
>
> The more I think about this, I tend to come to the conclusion that we
> need something powerful enough to allow both the current bind() and
> all of the above. Perhaps the syntax needn't be trivial, since we
> could then add simplifying aliases for whatever common use-cases we
> can identify.
>
> One option, for example, would be a bind-version that would actually
> map each function argument:
>
>    caller(func, self, { value: "123" }, { arg: 3 }, { arg: 1 }, { arg: -1 });
>
> Another might be to create higher order argument-mapping functions:
>
>    var flip = function (func, self, args) { return args.reverse(); };
>    caller(func, self, flip);
>
> These were just two ideas off the top of my head. But I think we
> should discuss more options here before plunging ahead and adding yet
> another variant of bind to MochiKit. Although they might all be very
> useful. It will slowly get too confusing for the average user.
>
> Thanks for reading this far! :-)
>
> Cheers,
>
> /Per
>
> On Thu, Dec 18, 2008 at 5:25 PM, Arnar Birgisson <arna...@gmail.com> wrote:
>> Hi all,
>>
>> On Thu, Dec 18, 2008 at 16:07, Bob Ippolito <b...@redivi.com> wrote:
>>> I'm not a real big fan of currying in languages where it's not
>>> built-in. It's easy to make a mistake by calling a function with too
>>> few arguments and you get a harder to track down bug. It also doesn't
>>> work well with languages that have default arguments or the equivalent
>>> (e.g. using the arguments object) because you don't know exactly when
>>> to stop currying.
>>
>> Actually, the functions I proposed (curry and uncurry, stolen form
>> Haskell) do not describe this kind of currying.
>>
>> curry takes a function of one argument, a tuple, and returns a
>> modified function that instead takes N arguments (the elements of the
>> tuple). The reason for the name curry is that it basically performs
>> the translation you (Bob) mentioned in Haskell, i.e. it transforms an
>> N argument function to a nesting of N one-argument functions, i.e. it
>> "curries" the function.
>>
>> uncurry takes a function of N arguments and returns a modified
>> function that instead takes one argument, a tuple of N elements.
>> Obviously the naming comes from this being the reverse of curry.
>>
>> The absolute main use case is mapping functions over a list of tuples
>> (in js list=tuple). This uses uncurry to change a function f(a,b) to
>> f(t) where t is a tuble of a and b. That way you can simply map (or
>> filter) the function over the outer list and arguments get placed in
>> the correct spot.
>>
>> Currying is a convenience for changing a function that takes a tuple
>> (i.e. a list in js) and apply it with the tuple elements as arguments
>> -- i.e. exactly what Function.apply does in js. I'd still include it
>> if uncurry is included, for the sake of symmetry.
>>
>> I do realize this might be a bit too eccentric -- but it is the kind
>> of thing that becomes very useful to grab when you do a lot of
>> functional-style programming in any language.
>>
>> Per provided bind("apply", operator.add, null) as equivalent to
>> uncurry. This is true, except that the context (this) is not
>> maintained.. but yes, maybe it is my weird style but I'd give an alias
>> to this.
>>
>> Dunno.. I'm happy to keep it in my personal library of helper functions :)
>>
>> cheers,
>> Arnar
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"MochiKit" group.
To post to this group, send email to mochikit@googlegroups.com
To unsubscribe from this group, send email to 
mochikit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to