2011-09-24 63 views
1

我有我使用來表示在一個wxHaskell對象wxAny其中的數據類型,目前我只支持wxAny S的含有StringInt,從而:使用Data.Typeable的鑄造與本地定義的數據類型

data Any 
    = IsString String 
    | IsInt Int 
    | IsUndefined 

我需要一個函數(a -> Any),我想知道我是否可以優雅地使用Data.Typeable,或者如果有人可以提出另一種方法?

回答

4

你可以簡單地通過cast功能與模式後衛組合做比較:

f :: Typeable a => a -> Any 
f x 
    | Just s <- cast x = IsString s 
    | Just n <- cast x = IsInt n 
    | otherwise = IsUndefined 

但這要求輸入是Typeable的實例,但最標準的類型有deriving Typeable子句,以便它通常不是一個問題。

+0

它是如何知道Just s和Just n不同? – CMCDragonkai

1

你可以用一個類型類這樣的:

class ToAny a where 
    toAny :: a -> Any 

instance ToAny Int where 
    toAny = IsInt 

instance ToAny String where 
    toAny = IsString 

對於其他情況下,你可能只是不叫上其他類型的值的功能 - 這將是更少的代碼。