2014-01-21 81 views
15

當類型的家庭打交道,它往往是得心應手等式約束,以避免在簽名重複某種功能的名稱:是否可以將其他類型變量引入超類約束?

class Foo f where 
    type BulkyAssociatedType f :: * 
    foo :: BulkyAssociatedType f -> f 
    ... 

bar :: forall m f b . 
     (Monad m, Foo f, b ~ BulkyAssociatedType f 
     , Monoid b, Monoid (m b) 
     ) => f -> m f 

這個工程即使縮寫不會在轉起來簽名本身,只限於約束。

有了類,這顯然是不可能的;

class (Foo f, b ~ BulkyAssociatedType f, Monoid b, ...) => Bar f 

抱怨類型變量b不在範圍內。

是否有某種方法可以實現類似的事情,以避免一些重複 - 樣板?

+0

這是一個很好的問題。我懷疑答案可能是「不」,但我的懷疑力度不夠,無法作出答案...... –

回答

7

這讓我很吃驚,瞭解你不能做到這一點(我用同樣的技術,並知道它在例如聲明),但似乎是一個長期GHC feature request支持這一點。

也許你可以使用ConstraintKinds得到同樣的好處:

{-# LANGUAGE TypeFamilies , FlexibleContexts , ConstraintKinds #-} 
import Data.Monoid 

class Foo f where 
    type BulkyAssociatedType f :: * 

type B f = (Monoid (BulkyAssociatedType f)) 

class (Foo f, B f) => Bar f 
相關問題