I pass the following to a function:

{#a, #b, #c} &

These are keys that are used in a list of associations. There are instances where I want to pass only the last 2 elements, such as:

{#b, #c} &

Right now, I just rewrite it. But it seems like there should be a way to do this by getting rid of the first slot.

I looked at the full form and see that it's:

FullForm[{#a, #b, #c} &]
Function[List[Slot["a"], Slot["b"], Slot["c"]]]

I thought I could somehow get inside and drop Slot["a"], but can't seem to do it. I tried replacing Slot["a"] with a blank, but I'm left with a comma at the beginning of the list. I also tried Apply to change Function to List and doing it in the result. I couldn't.

Is there any way to get rid of the first element, #a, without rewriting the expression?

  • $\begingroup$ Instead of a blank you could replace Slot["a"]->Nothing. You'll get this Nothing in the resulting function object, but once the function is applied, Nothing will collapse. $\endgroup$ – Ruslan Nov 21 '18 at 6:51

You could pass it to Delete:

Delete[#, {1, 1}] &[{#a, #b, #c} &]

{#b, #c} &

foo = {#a, #b, #c} &;

foo[[{1}, 2 ;;]]

{#b, #c} &

or, but only because we know there won't be any side effects:

Evaluate /@ Rest /@ foo 

{#b, #c} &


foo /. {_Slot, rest__Slot} :> {rest}

At the end consider using an operator form of a KeyDrop

bar = KeyTake[{"a", "b", "c"}];

(Rest /@ bar)@<|"a" -> 1, "b" -> 1, "c" -> 1|>

<|"b" -> 1, "c" -> 1|>

  • $\begingroup$ I accepted Coolwater's answer because it solved my problem simply. I appreciate the extra insight that your answer provided. Actually, I'll have to spend more time to really understand it though. $\endgroup$ – Mitchell Kaplan Nov 20 '18 at 21:51
  • $\begingroup$ @MitchellKaplan sure, btw, can you give a little insigth into how do you use it? Because it feels like a XY problem, maybe there is a better way anyway. $\endgroup$ – Kuba Nov 20 '18 at 21:55
  • $\begingroup$ I use a lot of lists of associations and very often I have to sum things by one or more keys. Why I asked this question: I work in reinsurance. My list has, among other things: treaty, effective date, line of business, IBNR. I'm estimating IBNR by all 3, but it has to balance to the total IBNR for effective/line. I need to sum both by all 3, but also by only effective/line. I call a function that does this, and I want to adjust the keys I'm using to eliminate treaty when I'm summing over just effective/line. Left some detail out to fit answer into comment. $\endgroup$ – Mitchell Kaplan Nov 21 '18 at 16:51

Your Answer

