Возможно, стоит отметить, что на практике библиотеку singletons
можно использовать для заботы о большинстве шаблонов. Таким образом, вы можете написать:
{-# LANGUAGE GADTs #-}
module Formality where
import Numeric.Natural
import Data.Singletons.Prelude
foo :: SBool b -> If b Bool Natural
foo SFalse = 0
foo STrue = False
, используя почти точно синтаксис, используемый @dfeuer, вплоть до порядка аргументов If
.
Основной недостаток singletons
Библиотека заключается в том, что любое серьезное программирование, зависящее от типа, в конечном итоге потребует понимания того, как на самом деле все реализовано внутри, а внутренности библиотеки сложны и не очень хорошо документированы.
Возможно, вам будет полезно начать вручную -компиляция некоторого Формальности, используя решение с нуля, используя ваши собственные одноадресные GADT и семейства типов (как в других ответах), а затем попытайтесь преобразовать его для использования singletons
.