2011-05-07 4 views
11

からTYPEREPを得る:ハスケル - 私はこの型シグネチャを持つ関数書きたい具体的なタイプのインスタンス

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

TYPEREPはないトンため、の型表現となります。つまり、コンパイラは、任意の呼び出しサイト[getTypeRep]に正しいタイプの表現を返します。具体的なタイプは、です。

コンテキストを追加するには、「ダイナミックタイプ」のデータタイプを作成します。そのデータタイプは、トップレベルのタイプを覚えていて、パラメータは記憶しないようにする必要があります。例えば、私はダイナミックMyClassのMyClassのを有効にすると、上記の機能は、typeパラメータの表現を格納しダイナミックMyClassののインスタンスを作成するために使用されます。

答えて

9

さて、どのように内部コンポーネントを選択するスコープ型変数の使用について:私のために

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

import Data.Dynamic 
import Data.Typeable 

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

作品:

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

面白いデザインを。

8

ドンの解の接線で、コードがめったにであることに気付くと、 ScopedTypeVariablesが必要です。それは単にソリューションをよりクリーンにします(ポータブルではありません)。スコープタイプない溶液である:

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

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

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

この関数(現在は)Data.TypeabletypeRep

に存在
関連する問題