bdonlanの答えに追加:代わりGADTsの、あなたもexistential typesを使用することができます。
{-# LANGUAGE ExistentialQuantification #-}
class Foo a where
foo :: a -> a
data AnyFoo = forall a. Foo a => AnyFoo a
instance Foo AnyFoo where
foo (AnyFoo a) = AnyFoo $ foo a
mapFoo :: [AnyFoo] -> [AnyFoo]
mapFoo = map foo
これは基本的にbdonlanのGADTソリューションと同等ですが、上のデータ構造の選択を課していない - ことができます例えば、リストの代わりにMap
を使用:
import qualified Data.Map as M
mFoo :: M.Map String AnyFoo
mFoo = M.fromList [("a", AnyFoo SomeFoo), ("b", AnyFoo SomeBar)]
data AnyFoo = forall a. Foo a => AnyFoo a
ビットとしてもGADT表記法で書くことができる:
data AnyFoo where
AnyFoo :: Foo a => a -> AnyFoo
'GHC.Prim.Any'を見てください。 –
'name'に実際に型を持たせたい場合は、型変数を使うべきです。しかし、あなたは確信していますか?人の名前はどんなタイプでもなければなりませんか?おそらく(例えば)名前としての 'Int'値や名前としての' Bool'値は健全ではないでしょうか? – phynfo
@phynfo、私が使ったサンプルは仮説です。私はそれをより一般的に改正しました。 – edwardw