Мне кажется, что вы можете реализовать функцию g
в терминах f
.Если это так, у вас есть весь необходимый вам полиморфизм без протокола B
.
Я имею в виду следующее, учитывая, что f
является полиморфным, тогда
(defn g [x y]
(* (f x) (f y)))
дает функцию g
, которая поддерживает все типы, реализующие протокол A
.
Часто, когда протоколы находятся в самом низу, простые функции, определенные только в терминах функций протокола (или для других функций, которые сами используют протокол), делают все пространство имен / библиотеку / программу очень полиморфным, расширяемым и гибким.
Библиотека последовательностей является отличным примером этого.Упрощенно, есть две полиморфные функции, first
и rest
.Остальная часть библиотеки последовательностей - это обычные функции.