Pure function inside another pure function
This is probably not going to be the best answer but offering it as an opener or as a guide to towards a better solution
Setting your initial input as a function
f[n_]:=Length[Select[IntegerPartitions[10],First[#]==n&]]
then
Map[f,Range[10]]
{1, 5, 8, 9, 7, 5, 3, 2, 1, 1}
No doubt regular contributors can improve on this
You can have a pure function inside a pure function even in this case, you just can't have the name of the parameter being "#" in both. This works:
Map[Function[x,
Length[Select[IntegerPartitions[10], First[#] == x &]]], Range[10]]
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
:)