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 типы как поле джейсона декодишь