Какой рекомендуемый способ проверки того, что список является списком чисел в аргументе функции?

Я рассматривал способы проверки аргументов функций. Я заметил, что. MatrixQ принимает 2 аргумента, второй - тест, который нужно применить к каждому элементу.

Но ListQ принимает только один аргумент. (также по какой-то причине у ?ListQ нет страницы помощи, как у ?MatrixQ).

Так, например, чтобы проверить, что аргумент функции является матрицей чисел, я пишу

ClearAll[foo]
foo[a_?(MatrixQ[#, NumberQ] &)] := Module[{}, a + 1]

Что было бы хорошим способом сделать то же самое для List? Это ниже только проверяет, что входные данные являются Списком

ClearAll[foo]
foo[a_?(ListQ[#] &)] := Module[{}, a + 1]

Я мог бы сделать что-то вроде этого:

ClearAll[foo]
foo[a_?(ListQ[#] && (And @@ Map[NumberQ[#] &, # ]) &)] := Module[{}, a + 1]

так что foo[{1, 2, 3}] будет работать, а foo[{1, 2, x}] - нет (предполагая, что x - символ). Но мне кажется, что это сложный способ сделать это.

Вопрос: Знаете ли вы лучший способ проверить, что аргумент является списком, а также проверить, что содержимое списка является Числом (или любой другой известный системе Mathematica способ?)

И смежный вопрос: Есть ли какие-нибудь серьезные проблемы с производительностью во время выполнения при добавлении таких проверок к каждому аргументу? Если да, то рекомендуете ли вы убрать эти проверки после завершения тестирования и разработки, чтобы конечная программа работала быстрее? (например, иметь версию кода со всеми проверками для разработки/тестирования и версию без них для производства).

14
задан Szabolcs 9 January 2012 в 00:33
поделиться