我正在尝试使用 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
免费的 monad?