айс, потому что где потом эта ошибка стрельнет? Не тотальные функции -- вот эта вся тема. Надо заворачивать в 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
А как композить типы с смарт-конструкторами не очень понятно.
Я бы тоже склонялся к 1, но я его библиотеку подробно не изучал Я бы на самом деле даже без TH это использовал Я профит от этого вижу в том что вся механика проверки предикатов становится автоматической (не надо руками Смарт конструкторы писать), программисту гарантируется что все значения хорошие, и появляется возможность делать всякие интересности с предикатами типо автоматически вставлять их описание в документацию или автоматически проверять предикаты когда например refined типы как поле джейсона декодишь
Обсуждают сегодня