Я опубликовал рекурсивное решение, но затем решил удалить его, так как из комментариев это звучит как домашнее задание, и я, как правило, учусь ловить рыбу.
Вы находитесь напуть к рекурсивному решению с вашим определением newMap[f_, {}] := {}
.
Сопоставление с образцом Mathematica - ваш друг.Подумайте, как вы можете реализовать определение для newMap[f_, {e_}]
, а оттуда newMap[f_, {e_, rest___}]
.
Последний совет: если вы можете определить эту последнюю функцию, вам на самом деле не нужен регистр для {e_}
.
ОБНОВЛЕНИЕ :
Исходя из ваших комментариев, возможно, этот пример поможет вам понять, как применить произвольную функцию:
func[a_, b_] := a[b]
In[4]:= func[Abs, x]
Out[4]= Abs[x]
РЕШЕНИЕ
Поскольку ОП поймал рыбу,говоря, (поздравляю!) вот два рекурсивных решения, чтобы удовлетворить любопытство любых зрителей.Вероятно, это первое, что я бы назвал «идиоматическим» Mathematica:
map1[f_, {}] := {}
map1[f_, {e_, rest___}] := {f[e], Sequence@@map1[f,{rest}]}
Вот подход, который не использует сопоставление с образцом в достаточной степени, что в основном и привело к тому, что OP закончился:
map2[f_, {}] := {}
map2[f_, lis_] := {f[First[lis]], Sequence@@map2[f, Rest[lis]]}
Часть {f[e], Sequence@@map[f,{rest}]}
может быть выражена различными эквивалентными способами, например:
Prepend[map[f, {rest}], f[e]]
Join[{f[e]}, map[f, {rest}]
(@Mike использовал этометод) Flatten[{{f[e]}, map[f, {rest}]}, 1]
Я предоставлю читателю возможность больше думать и размышлять над влиянием большинства из них на производительность =)
Наконец, для забавы, вот процедурная версия, хотя ее написание сделало меня немного тошнотворным:; -)
map3[f_, lis_] :=
(* copy lis since it is read-only *)
Module[{ret = lis, i},
For[i = 1, i <= Length[lis], i++,
ret[[i]] = f[lis[[i]]]
];
ret
]