Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to get higher order functions to work in powershell

I can't get this example to work

{ $_ + $_ }, { $_ + 1}, {$_ - 1} | % { $_ 1 }

I want it to construct a list/array/collection/whatever of functions (this part is fine), and then pipe that list to the code block on the right, which applies each of the functions to the argument 1 and returns an array with the results (namely; 2,2,0). I've tried using the getnewclosure() method, the & operator, nothing's worked so far.

like image 594
TheIronKnuckle Avatar asked Jul 11 '13 02:07

TheIronKnuckle


1 Answers

The dollar underbar variable is an automatic variable that is only populated in certain scenarios; in this case, when there is an incoming object from the pipeline. In order to give the $_ the value of 1, which appears to be your intent, you'll have to pipe the number to each and also execute the scriptblock. The easiest way to do this is to pass it directly as an argument to % (foreach-object) which accepts a scriptblock:

PS> { $_ + $_ }, { $_ + 1}, {$_ - 1} | % { 1 | % $_ }
2
2
0

Look at it until it makes sense :) If it doesn't click, comment back here and I'll explain in more detail.

If you're interested in functional tinkering in powershell, you might enjoy this function I wrote for partial application:

http://www.nivot.org/blog/post/2010/03/11/PowerShell20PartialApplicationOfFunctionsAndCmdlets

It's a bit unwieldy, but still possible.

like image 143
x0n Avatar answered Nov 15 '22 04:11

x0n