这个问题与本质上是一样的,但是我正在特别地寻找一个使用Maybe类型安全处理范围外变量的答案(因此不使用Haskell的错误机制)。
具体来说,我有以下这些类型:
type Name = Int
data Lam = Var Name | Lam Name Lam | App Lam Lam
data LamP p = VarP p | LamP (p -> LamP p) | AppP (LamP p) (LamP p)
为了简单起见,我使用整数作为名称。
从LamP到Lam很简单:
fromP :: (forall p. LamP p) -> Lam
fromP x0 =