簡體   English   中英

使用Data.Typeable的強制類型轉換與本地定義的數據類型

[英]Using Data.Typeable's cast with a locally defined data type

我有一個數據類型,用於在wxHaskell中表示一個wxAny對象,目前我僅支持wxAny ,其中包含StringInt ,因此:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM