對於我的邪惡且主要是不可理解的原因,我決定要一個類型級別爲 的函數來指示類型的類實例的存在。它的工作是這樣的:Haskell中類型級別的類型級別指示器函數
> :kind! HasClass Show Int
> 'True
> :kind! HasClass Monoid Int
> 'False
鑑於約束類型等加入到GHC最近,我有一種感覺,這是可能的,但沒有整齊實施想到的。可以做到嗎?
對於我的邪惡且主要是不可理解的原因,我決定要一個類型級別爲 的函數來指示類型的類實例的存在。它的工作是這樣的:Haskell中類型級別的類型級別指示器函數
> :kind! HasClass Show Int
> 'True
> :kind! HasClass Monoid Int
> 'False
鑑於約束類型等加入到GHC最近,我有一種感覺,這是可能的,但沒有整齊實施想到的。可以做到嗎?
爲什麼不只是這個?
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 #-}
在GHC 7.8.x中提供了「重複的實例聲明......衝突的系列實例聲明」。 – JJJ
@JJJ:啊,慚愧,但可能是件好事。 –
應該是不可能的(作爲一種功能),因爲它違反了開放世界的假設。儘管你可以用重疊的實例和有趣的代碼來完成它。 –