11

この型シグネチャを持つ関数を書きたい:

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

TypeRep は、 taではなくaの型表現になります。つまり、コンパイラは、任意の呼び出しサイトで [ getTypeRepに] の具体的な型を持つ正しい型表現を自動的に返す必要があります。

いくつかのコンテキストを追加するために、「動的型」データ型を作成したいと思います。これは、最上位の型を記憶するが、そのパラメーターは記憶しないというひねりを加えたものです。たとえば、MyClass aDynamic MyClassに変換したい場合、上記の関数を使用して、型パラメーターaの表現を格納するDynamic MyClassのインスタンスを作成します。

4

3 に答える 3

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

面白いデザイン。

于 2011-05-08T01:11:18.140 に答える
8

Don のソリューションの補足として、コードでScopedTypeVariablesが必要になることはめったにないことに注意してください。ソリューションをよりクリーンにするだけです(ただし、移植性は低くなります)。スコープ型のないソリューションは次のとおりです。

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

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

getTypeRep :: forall t a. Typeable a => t a -> TypeRep
getTypeRep = typeOf . helper
于 2011-05-08T02:40:47.723 に答える
0

この関数 (現在) はData.Typeable typeRepに存在します

于 2016-12-30T04:48:01.727 に答える