2016-11-04 53 views
3

我正在尋找方式將類型信息帶入Haskell的值級別。如何將類型信息帶入Haskell的值級別?

我知道將任何類型信息表示爲值的一種方法是Language.Haskell.TH.Type。 有沒有什麼辦法可以實現Proxy a並返回Language.Haskell.TH.Type(或替代類型來表示任何類型)的函數,如下所示的a類型?

如果您有更好的想法將類型信息作爲不使用Language.Haskell.TH.Type的值,請告訴我。

import Data.Proxy (Proxy) 
import Language.Haskell.TH (Type, TypeQ) 

-- | 
-- >>> amazing (Proxy :: Proxy Bool) 
-- ConT GHC.Types.Bool 
-- 
-- >>> amazing (Proxy :: Proxy [String]) 
-- AppT ListT (ConT GHC.Base.String) 
amazing :: Proxy a -> Type 
amazing p = undefined 

-- | 
-- Or if above is impossible, how about this? 
amazingQ :: Proxy a -> TypeQ 
amazingQ p = undefined 
+0

即使我自己沒有使用它 - 但是你看看[Data.Data](https://hackage.haskell.org/package/base-4.7.0.1/docs/Data-Data.html )也許它提供了足夠的信息。 – epsilonhalbe

+0

['typeRep'](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Typeable.html#v:typeRep)似乎足夠接近。 – chi

回答

1

我歸結爲找到你想要處理的類型信息。無論哪種情況,您可能要查看的模塊都是Data.TypeableData.Data。在這些模塊的中心是兩個類型類(通過-XDeriveDataTypeable deriveable)

class Typeable a where {...} 
class Typeable a => Data a where {..} 

由於@chi提到,前者的這些讓你捅了類型,以瞭解它的信息。也就是說有一點需要注意,你需要Typeable的實例才能工作(儘管如果你真的需要......你可以開始製作這些孤立實例)。特別是,有typeRep

ghci> import Data.Typeable 
ghci> typeRep (Proxy :: Proxy (Either (Maybe [Integer]) ((), Bool, Int))) 
Either (Maybe [Integer]) ((), Bool, Int) 

但是,如果你決定要使用的類型信息,試圖查找該值表示(即構造函數)有,你會想看看Data.Data