2014-03-04 112 views
4

對於我的邪惡且主要是不可理解的原因,我決定要一個類型級別爲 的函數來指示類型的類實例的存在。它的工作是這樣的:Haskell中類型級別的類型級別指示器函數

> :kind! HasClass Show Int 
> 'True 
> :kind! HasClass Monoid Int 
> 'False 

鑑於約束類型等加入到GHC最近,我有一種感覺,這是可能的,但沒有整齊實施想到的。可以做到嗎?

+5

應該是不可能的(作爲一種功能),因爲它違反了開放世界的假設。儘管你可以用重疊的實例和有趣的代碼來完成它。 –

回答

1

爲什麼不只是這個?

class HasClass (c :: * -> Constraint) a where 
    type Has c a :: Bool 

instance HasClass c a where 
    type Has c a = 'False 

instance (c a) => HasClass c a where 
    type Has c a = 'True 

只要你不介意了一些擴展:

{-# LANGUAGE ConstraintKinds #-} 
{-# LANGUAGE DataKinds #-} 
{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE KindSignatures #-} 
{-# LANGUAGE MultiParamTypeClasses #-} 
{-# LANGUAGE TypeFamilies #-} 
{-# LANGUAGE UndecidableInstances #-} 
+0

在GHC 7.8.x中提供了「重複的實例聲明......衝突的系列實例聲明」。 – JJJ

+0

@JJJ:啊,慚愧,但可能是件好事。 –