Я рассматривал способы проверки аргументов функций. Я заметил, что
MatrixQ
принимает 2 аргумента, второй - тест для применения к каждому элементу.
Но ListQ
принимает только один аргумент. (также по какой-то причине ?ListQ
не имеет справочной страницы, например ?MatrixQ
).
Итак, например, чтобы проверить, что аргумент функции является матрицей чисел, я пишу
ClearAll[foo]
foo[a_?(MatrixQ[#, NumberQ] &)] := Module[{}, a + 1]
Что было бы хорошим способом сделать то же самое для List? Это ниже только проверяет, что вход представляет собой 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
является символом). Но мне кажется, что это сложный способ сделать это.
Вопрос: Знаете ли вы, что лучший способ проверить, что аргумент является списком, а также проверить содержимое списка как Numbers (или любой другой главы, известной Mathematica?)
И связанный с этим вопрос: Какие-либо серьезные проблемы производительности во время выполнения с добавлением таких проверок для каждого аргумента? Если да, рекомендуете ли вы, чтобы эти проверки были удалены после завершения тестирования и разработки, чтобы конечная программа выполнялась быстрее? (например, иметь версию кода со всеми проверками, для разработки/тестирования и версии без производства).