Я рассматривал способы проверки аргументов функций. Я заметил, что.
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 способ?)
И смежный вопрос: Есть ли какие-нибудь серьезные проблемы с производительностью во время выполнения при добавлении таких проверок к каждому аргументу? Если да, то рекомендуете ли вы убрать эти проверки после завершения тестирования и разработки, чтобы конечная программа работала быстрее? (например, иметь версию кода со всеми проверками для разработки/тестирования и версию без них для производства).