как различить слот в нескольких уровнях чистых функций в математике - PullRequest
3 голосов
/ 27 января 2011

Например, у меня может быть

{1, 2, 3, 4, 5} // Select[#1, ((*** + 1 &) > 2) &] &

Здесь *** также хочет быть # 1, но не распознается как # 1 самого внешнего слоя.Есть ли способ отличить два?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 27 января 2011

Я не уверен, что понимаю вопрос. Каков ожидаемый результат? .. {2,3,4,5}? ... Если это так, между слотами нет логической путаницы: каждый элемент в списке, который является первым аргументом Select, будет передан в функцию (второй аргумент). Следующее работает просто отлично:

{1, 2, 3, 4, 5} // Select[#, ((# + 1) > 2) &] &

В случае возникновения конфликта вместо обозначения слота / амперсанда можно использовать обозначение Function[{x,y,...},...], например,

{1, 2, 3, 4, 5} // Select[#, Function[{x}, (x + 1) > 2]] &

3 голосов
/ 27 января 2011

В вашем коде слишком много амперсандов, попробуйте

{1, 2, 3, 4, 5} // Select[#1, ((# + 1) > 2) &] &

Таким образом #1 выбирает элемент из списка и передает его в функцию теста сравнения.Таким образом, в действительности #1 и # получают один и тот же элемент.

Нет никакого смысла иметь ((# + 1&) > 2)& в качестве функции сравнения, поскольку внешняя функция не может передавать свои аргументы.Вы фактически написали (F > 2)&, и хотя F - чистая функция, для ее аргументов нет слота.Для того, чтобы работать, вам нужно написать ((# + 1&[#]) > 2)&, что равно (F[#] > 2)&.

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