Привет.
Прошло довольно много времени с публикации предыдущей статьи об обобщённой реализации паттерна Has
, где мы успешно победили скуку и однообразный код при написании инстансов соответствующего класса, заодно поигравшись с дженериками и семействами типов одновременно, но давайте всё же добьём цикл и заодно лишний раз посмотрим, зачем программисту математика.
Итак, с обобщённой реализацией паттерна Has
мы разобрались. Какой следующий интересный вопрос можно задать? Ну, например, можем ли мы обобщить наше решение, которое, к слову, является обобщением (Has Foo
) обобщения (HasFoo
) обобщения (MonadReader Foo
) обобщения (Reader Foo
) понятия параметра функции (Foo ->
)? И, оказывается, что да, можем, и аж в двух ортогональных измерениях!
В частности, мы придумаем аж два паттерна имени нас, причём один из них — бесплатно, совершенно не включая мозг, а лишь основываясь на алгебре.