[英]Using Data.Typeable's cast with a locally defined data type
我有一個數據類型,用於在wxHaskell中表示一個wxAny對象,目前我僅支持wxAny
,其中包含String
或Int
,因此:
data Any
= IsString String
| IsInt Int
| IsUndefined
我需要一個函數( Data.Typeable
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
在另一種情況下,您不能僅在其他類型的值上調用該函數-這樣可以減少代碼量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.