Я пытаюсь определить тип абстрактного синтаксиса, используя библиотеки ekmett bound
и free
. У меня есть что-то работающее, что я могу разобрать до следующего минимального примера:
{-# LANGUAGE DeriveFunctor #-}
import Bound
import Control.Monad.Free
type Id = String
data TermF f α =
AppF α α
| BindF Id (Scope () f α)
deriving Functor
newtype Term' α = T {unT :: Free (TermF Term) α}
type Term = Free (TermF Term')
Последние две строчки - это не то, на что я надеялся. Они делают своего рода PITA, чтобы фактически использовать открытую рекурсию для аннотаций (или чего-то еще).
Есть ли лучший способ совместного использования этих двух библиотек и/или мне просто отказаться от попыток сделать Term
бесплатной монадой?