Карта, чтобы принять единственное число или коллекцию - PullRequest
2 голосов
/ 11 августа 2011

Есть ли лучший способ сделать это в Clojure?

(if (coll? coll)
  (map my-fn coll)
  (my-fn coll)

my-fn применяется для ввода coll. coll может быть как единичным, так и коллекционным.

Если я не проверю coll?, использование только map приведет к исключению IllegalArgumentException, так как я не знаю, как создать ISeq из xxx.

Ответы [ 3 ]

4 голосов
/ 12 августа 2011

Ваш код в порядке (хотя я бы переименовал переменную coll, поскольку вы на самом деле не знаете, является ли она коллекцией, и это может сбить читателей с толку).

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

Альтернативные идеи для рассмотрения:

  • Если вы действительно хотите обрабатывать все как коллекцию, то оберните входные значения единственного числа, когда они впервые получены в списке / векторе длины 1. Затем остальная часть вашего кодаможет безопасно принимать коллекции по всему.
  • Напишите отдельные функции для работы с коллекциями и отдельными значениями.Смысл в том, что это концептуально разные типы данных, поэтому они заслуживают разного подхода.
1 голос
/ 12 августа 2011

Не может быть общего решения, потому что my-fn может быть функцией, которая принимает списки и возвращает списки. Тогда вы не можете каким-то образом проверить входные данные и решить, отображать ли их поверх или нет.

Лучше не вмешиваться в ситуацию, когда вы не знаете, какой тип данных у вас есть, но я не могу дать какой-либо конкретный совет по этому поводу, не зная больше о вашей программе.

1 голос
/ 11 августа 2011

Если coll не содержит вложенных последовательностей:

(map my-fn (flatten (list coll)))
...