Using Curry or OperatorApplied
Pure function nesting is one of the use cases for Curry, introduced in version 11.3:
Length[
Select[IntegerPartitions[10], Curry[First[#] == #2 &][#]]
] & /@ Range[10]
(* {1, 5, 8, 9, 7, 5, 3, 2, 1, 1} *)
First[#1] == #2 &
defines a two argument pure function. By wrapping Curry[...][#]
around this, we bind the inner slot reference #2
to the value of the outer slot reference #
. After binding, we are left with a single argument function that is suitable for use with Select
. For example, in one mapping iteration the outer #
has the value 7
and the curried function Curry[First[#1] == #2 &][7]
is essentially equivalent to First[#1] == 7 &
.
Update for version 12.1
In version 12.1, OperatorApplied is the new name for Curry
. The documentation for Curry
states that it is now being phased out.
Currying The Hard Way
A rather obscure idiom makes it possible to perform such currying in pure functions, even before version 11.3:
Length[
Select[IntegerPartitions[10], #0[[0]][First[#[1]] == #2] &[Slot, #]]
] & /@ Range[10]
(* {1, 5, 8, 9, 7, 5, 3, 2, 1, 1} *)
The cryptic expression #0[[0]][First[#[1]] == #2]&[Slot, #]
performs the necessary currying. #0[[0]]
expands to Function
. The disguised use of the symbol Function
is necessary to avoid shadowing the inner slot references. #[1]
expands to Slot[1]
, i.e. #1
. #2
expands to the value of the outer #
. So, if the outer #
were 7
, then we would get First[#1] == 7 &
as desired.
This construction is likely too ugly to actually use. Thank goodness for the arrival of Curry
:)
Map[ With[{a = #}, Length[Select[IntegerPartitions[10], First[#] == a &]]] &, Range[10]] Out[257]= {1, 5, 8, 9, 7, 5, 3, 2, 1, 1}
$\endgroup$