On 07/27/2014 10:48 AM, bearophile wrote:
> In std.functional there is a curry(), that looks more like a partial 
> application.
> 
> In the Python land I've recently seen a library for a more functional style 
> of coding:
> https://pypi.python.org/pypi/PyMonad/
> 
> I don't like for Python most of the stuff in that PyMonad library, but two 
> bits look nice. I quote them here:
> 
> <<
> 
> @curry
> def add(x, y):
>     return x + y
> 
> @curry
> def func(x, y, z):
>     # Do something with x, y and z.
>     ...
> 
> The above fuctions can be partially applied by passing them less than their 
> full set of arguments:
> 
> add(7, 8)            # Calling 'add' normally returns 15 as expected.
> add7 = add(7)        # Partial application: 'add7' is a function taking one 
> argument.
> add7(8)              # Applying the final argument retruns 15...
> add7(400)            # ... or 407, or whatever.
> 
> # 'func' can be applied in any of the following ways.
> func(1, 2, 3)        # Call func normally.
> func(1, 2)(3)        # Partially applying two, then applying the last 
> argument.
> func(1)(2, 3)        # Partially applying one, then applying the last two 
> arguments.
> func(1)(2)(3)        # Partially applying one, partially applying again, then 
> applying the l
> 
> 
> 
> Curried functions can be composed with the * operator. Functions are applied 
> from right to left:
> 
> # Returns the first element of a list.
> @curry
> def head(aList):
>     return aList[0]
> 
> # Returns everything except the first element of the list.
> @curry
> def tail(aList):
>     return aList[1:]
> 
> second = head * tail        # 'tail' will be applied first, then its result 
> passed to 'head'
> second([1, 2, 3, 4])        # returns 2
> 
> 
> You can also compose partially applied functions:
> 
> @curry
> def add(x, y):
>     return x + y
> 
> @curry
> def mul(x, y):
>     return x * y
> 
> comp = add(7) * mul(2)        # 'mul(2)' is evaluated first, and it's result 
> passed to 'add(7)'
> comp(4)                        # returns 15
> 
>>>
> 
> 
> Perhaps I'd like in Phobos a "curry" (or another name) template that returns 
> a callable struct that allows both those operations: the currying with 
> arbitrary partial application and the "*" operator to perform function 
> composition (I think the two pieces of functionality go well together despite 
> being different things, because they are both used in a very functional style 
> of coding).
> 
> Bye,
> bearophile

So, in the next release std.functional.curry has been renamed to 
std.functional.partial:

https://github.com/D-Programming-Language/phobos/pull/1979

I was starting to work on a proper curry replacement, but due to some real-life 
stuff I haven't had time.

There's some starting code at https://issues.dlang.org/show_bug.cgi?id=4391 
that I was basing mine off of, but I was running into some issues involving 
static, and a ton of issues with templated functions. This might be something 
worth looking into?

--
Matt Soucy
http://msoucy.me/

-- 
Matt Soucy
http://msoucy.me/

Reply via email to