Вы, конечно, можете использовать последовательность Clojure для представления нуля, одного или нескольких возвращаемых значений.
Это разумный и очень идиоматичный подход, если ваша функция действительно должна возвращать коллекцию.
Однако я бы не рекомендовал использовать последовательность для эмуляции типа параметра,Это может запутать пользователей вашего API.В Clojure обычный идиоматический способ - просто вернуть nil, если значение недоступно, и вернуть значение напрямую, если оно есть.
Сравните:
(if-let [a (function-that-returns-nil-or-result)]
(do-something-with a))
С тем, что выпонадобится, если вы использовали последовательность для эмуляции типа параметра:
(if-let [a (function-that-returns-a-possibly-empty-sequence)]
(do-something-with (first a)))
Я определенно предпочитаю первый вариант .... зачем нам или нужно, чтобы пользователь API распаковывал результат из последовательности с помощью first
?
В целом, nil работает довольно хорошо в Clojure (намного лучше, чем в других языках), потому что:
- Все функции библиотеки интерпретируют nil как пустую последовательность, поэтомугораздо реже встречаются с NullPointerExceptions.
- nil также считается "ложным", поэтому его удобно использовать в логических операциях.