Если вы хотите написать x = f(4,y)
, а позже просто наберите x(2)
, чтобы получить -36
, что называется частичное применение :
Интуитивно понятно, что приложение с частичной функцией говорит: «Если вы исправите первые аргументы функции, вы получите функцию из оставшихся аргументов».
Это очень полезная функция, иочень распространенные языки функционального программирования, такие как Haskell, но даже JS и Python теперь могут это сделать.Это также возможно сделать в MATLAB и GNU / Octave, используя анонимные функции ( см. Этот ответ ).В Scilab, однако, эта функция недоступна .
Workround
Тем не менее, сам Scilab использует обходные пути для переноса функции со своими аргументамибез полной оценки.Вы видите, что это используется в ode()
, fsolve()
, optim()
и других:
- Создайте
list
, содержащий функцию и аргументы для частичной оценки: list(f,arg1,arg2,...,argn)
- Используйте другую функцию для оценки такого списка и последнего аргумента:
evalPartList(list(...),last_arg)
Реализация evalPartList()
может выглядеть примерно так:
function y = evalPartList(fList,last_arg)
//fList: list in which the first element is a function
//last_arg: last argument to be applied to the function
func = fList(1); //extract function from the list
y = func(fList(2:$),last_arg); //each element of the list, from second
//to last, becomes an argument
endfunction
Youможете проверить это на консоли Scilab:
--> deff ('[F] = fun (x, y)', 'F = x ^ 2-3 * y ^ 2 + x * y ^ 3');
--> x = list(fun,4)
x =
x(1)
[F]= x(1)(x,y)
x(2)
4.
--> evalPartList(x,2)
ans =
36.
Это очень простая реализация для evalPartList()
, и вы должны быть осторожны, чтобы не превысить или не сократить количество аргументов.