Как мне написать функцию для использования в Apply в Mathematica? - PullRequest
3 голосов
/ 01 февраля 2011

Мне интересно, как я могу написать функцию для использования в функции Apply в Mathematica? Например, я хочу тривиально повторно реализовать функцию Or, я нашел следующее

Apply[(#1 || #2)&,{a,b,c}]

не в порядке, так как он только Or 'редактировал первые два элемента в списке. Большое спасибо!

Ответы [ 3 ]

11 голосов
/ 01 февраля 2011

Это будет работать, независимо от того, сколько варов, и это общий шаблон:

Or[##]&,

например

In[5]:= Or[##] & @@ {a, b, c}

Out[5]= a || b || c

Однако в случае Or этого недостаточно, поскольку Or равно HoldAll и имеет короткое замыкание, то есть останавливается на первом операторе True и сохраняет остальную часть без оценки. Пример:

In[6]:= Or[True, Print["*"]]

Out[6]= True

In[7]:= Or[##] & @@ Hold[True, Print["*"]]

During evaluation of In[7]:= *

Out[7]= True

Это будет хорошо, хотя:

Function[Null,Or[##],HoldAll],

например,

In[8]:= Function[Null, Or[##], HoldAll] @@ Hold[True, Print["*"]]

Out[8]= True

и может использоваться в таких случаях (когда вы не хотите, чтобы ваши аргументы оценивались). Обратите внимание, что здесь используется недокументированная форма Function. Упоминание об этой форме можно найти в книге Р.Медера «Программирование в Mathematica».

НТН

4 голосов
/ 01 февраля 2011
Or @@ {a, b, c}     

Эквивалент

Apply[Or, {a, b, c}]  

Эквивалент

{a, b, c} /. {x_, y__} -> Or[x, y]  

Применить работает так:

{2 #1, 3 #2, 4 #3} & @@ {a, b, c}  
{2 a, 3 b, 4 c}

Plus[2 #1, 3 #2, 4 #3] & @@ {a, b, c}
2 a + 3 b + 4 c
0 голосов
/ 01 февраля 2011

Вы уверены, что ожидаете правильного от Apply? Если вы посмотрите в документации, http://reference.wolfram.com/mathematica/ref/Apply.html,, вы увидите, что Apply [f, expr] просто заменяет заголовок f на expr. Он не , в общем случае дает f [expr].

Если вы хотите работать с функцией f на expr, попробуйте f @ expr или f [expr].

Возможно, вы понимаете вышесказанное, и ваш вопрос на самом деле таков: «Как мне определить некоторый f, который, когда я делаю Apply[f,{a,b,c}], выполняет ту же работу, что и Or[a,b,c]. Это так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...