Ваша проблема в том, что вы пытаетесь использовать значения для a
в построении тела процедуры , а не " RHS выражения ", как вы Заявленный.
Старайтесь не использовать термин "функция" в этом контексте, поскольку он просто запутывает различие между выражением и процедурой.
Вот способ получить значения из ix
в качестве замены a
в сгенерированном списке процедур с (x-a)^2
в теле.
restart;
ix := [-1,0,1]:
b := []:
for a in ix do
b := [op(b), unapply((x-a)^2,x)];
end do:
b;
[x -> (x+1)^2, x -> x^2, x -> (x-1)^2]
Неэффективно создавать списки таким образом, многократно объединяя их. Так как эта практика плохо масштабируется в производительности, вы действительно должны отбросить ее как практику.
Вы можете составить весь список одним вызовом seq
.
Flist := [ seq( unapply((x-a)^2,x), a in ix ) ]:
Flist;
[x -> (x+1)^2, x -> x^2, x -> (x-1)^2]
Здесь, Flist
- это список процедур, каждую из которых можно оценить по значению, вызвав его с аргументом.
Flist[1];
x -> (x+1)^2
Flist[3](3.4);
5.76
#plot(Flist, -2..2);
Примечание. Процедуры, отображаемые в виде стрелки x -> ...
, называются операторами .
Для забавы, вот эквиваленты, используя выражения ,
Elist := [ seq( (x-a)^2, a in ix ) ]:
Elist;
[ 2 2 2]
[(x + 1) , x , (x - 1) ]
Elist[1];
2
(x + 1)
eval(Elist[3], x=3.4);
5.76
#plot(Elist, x=-2..2);
Существуют и другие способы генерации процедур со значениями a
в теле указывается программно. Команда unapply
- не единственный возможный механизм, хотя для вашего примера это самый простой способ.
Другой способ - заменить, например,
generic := x -> (x-_dummy)^2:
Hlist := [ seq( subs(_dummy=a, eval(generic)), a in ix ) ]:
Hlist;
[x -> (x+1)^2, x -> x^2, x -> (x-1)^2]