2011-05-07 12 views
11

den TypeRep olsun:Haskell - Bu tip imzası ile bir fonksiyon yazmak istiyorum beton tipi örneği

getTypeRep :: Typeable a => t a -> TypeRep 

TypeRep değil t için, bir tip gösterimi olacak. Yani derleyici, ve için somut türlere sahip olan herhangi bir çağrı sitesinde [getTypeRep] doğru tip temsilini otomatik olarak döndürmelidir.

Bazı bağlam eklemek için, üst düzey türünü hatırlayacağına, ancak parametresini değil, "Dinamik" bir veri türü oluşturmak istiyorum. Mesela ben Dinamik Sınıfım içine Sınıfım bir açmak istiyor ve yukarıdaki fonksiyon tipi parametresi bir bir temsilini saklamak Dinamik Sınıfım örneklerini oluşturmak için kullanılacaktır.

cevap

9

Peki iç bileşenin seçmek için kapsamına sahip tip değişkenleri kullanma hakkında: Benim için

{-# LANGUAGE ExplicitForAll #-} 
{-# LANGUAGE ScopedTypeVariables #-} 

import Data.Dynamic 
import Data.Typeable 

getTypeRep :: forall t a . Typeable a => t a -> TypeRep 
getTypeRep _ = typeOf (undefined :: a) 

İşleri:

*Main> getTypeRep (Just()) 
() 
*Main> getTypeRep (Just 7) 
Integer 
*Main> getTypeRep ([True]) 
Bool 

İlginç tasarım.

8

Don'un çözümüne ilişkin teğet bir notta, nadiren kodunun ScopedTypeVariables olduğunu unutmayın. Sadece çözümü temizler (ancak daha az taşınabilir). kapsamlı tip olmadan çözüm:

{-# LANGUAGE ExplicitForAll #-} 
import Data.Typeable 

helper :: t a -> a 
helper _ = undefined 

getTypeRep :: forall t a. Typeable a => t a -> TypeRep 
getTypeRep = typeOf . helper