我有我使用來表示在一個wxHaskell對象wxAny其中的數據類型,目前我只支持wxAny
S的含有String
或Int
,從而:使用Data.Typeable的鑄造與本地定義的數據類型
data Any
= IsString String
| IsInt Int
| IsUndefined
我需要一個函數(a -> Any
),我想知道我是否可以優雅地使用Data.Typeable
,或者如果有人可以提出另一種方法?
我有我使用來表示在一個wxHaskell對象wxAny其中的數據類型,目前我只支持wxAny
S的含有String
或Int
,從而:使用Data.Typeable的鑄造與本地定義的數據類型
data Any
= IsString String
| IsInt Int
| IsUndefined
我需要一個函數(a -> Any
),我想知道我是否可以優雅地使用Data.Typeable
,或者如果有人可以提出另一種方法?
你可以簡單地通過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
子句,以便它通常不是一個問題。
你可以用一個類型類這樣的:
class ToAny a where
toAny :: a -> Any
instance ToAny Int where
toAny = IsInt
instance ToAny String where
toAny = IsString
對於其他情況下,你可能只是不叫上其他類型的值的功能 - 這將是更少的代碼。
它是如何知道Just s和Just n不同? – CMCDragonkai