IK
positive2 в Вашем примере -- это не айс, потому что где потом эта ошибка стрельнет? Не тотальные функции -- вот эта вся тема. Надо заворачивать в MonadFail или MonadThrow.Я могу представить себе преимущество от наворачивания Template Haskell поверх смарт-конструкторов только для тестов. Там полно мест где значения будут конструироваться из литералов и хочется избежать бесконечных
fromJust:$$(positiveTH 1) vs fromJust . positive $ 1В боевом коде особых преимуществ TH поверх конструктора наверное нет -- там значения приходят снаружи и рантайм проверки не избежать.
Волковская библиотека позволяет делать рантайм проверки. В случае рантайм проверок вопрос остаётся: 1.
Refined Positive Int vs 2. Смарт конструктор Positive vs 3. Int.Я склоняюсь к 1, потому что предикаты можно композить:
Refined (And Positive Even) IntА как композить типы с смарт-конструкторами не очень понятно.
Я бы на самом деле даже без TH это использовал
Я профит от этого вижу в том что вся механика проверки предикатов становится автоматической (не надо руками Смарт конструкторы писать), программисту гарантируется что все значения хорошие, и появляется возможность делать всякие интересности с предикатами типо автоматически вставлять их описание в документацию или автоматически проверять предикаты когда например refined типы как поле джейсона декодишь
