我試圖爲一個歸納數據類型(描述帶數據類型和模式匹配的lambda演算版本)創建一個靈活表示。這裏的靈活性應該意味着在節點上添加額外的數據(免費的comonad風格)或者替換(免費的monad風格)很容易。因此,這裏是我有:在實例上下文中需要泛型實例(對於更高版本類型的構造函數)
type Tie f φ = φ (f φ)
type Id = String
type Var = Id
type Con = Id
data Pat φ = PVar Var
| PCon Con [Tie Pat φ]
| PWildcard
data Expr φ = EVar Var
| ECon Con
| EApp (Tie Expr φ)
| ELam (Tie Pat φ) (Tie Expr φ)
麻煩的是當我想要得到的Show
實例。當然,我可以做這樣的事情:
{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
{-# LANGUAGE StandaloneDeriving #-}
deriving instance (Show (φ (Pat φ))) => Show (Pat φ)
deriving instance (Show (φ (Expr φ)), Show (φ (Pat φ))) => Show (Expr φ)
但是,當歸納結構變得更加複雜時,用手寫出上下文變得笨拙。
理想情況下,我希望能夠寫類似
{-# LANGUAGE RankNTypes #-}
deriving instance (forall a. Show (φ a)) => Show (Expr φ)
以表達算符φ應該是,在某種意義上,「透明」,以顯示實例。
有沒有辦法做到這一點?
我從來沒有在超類上下文中看到「forall」。 – 2012-08-09 07:19:46
是的,因此這個問題... – Cactus 2012-08-09 11:12:39