使用Data.Typeable使用本地定义的数据类型进行转换

时间:2011-09-24 02:17:29

标签: haskell types casting

我有一个数据类型,我用来表示wxHaskell中的wxAny对象,目前我只支持包含wxAnyString的{​​{1}}个,因此:

Int

我需要一个函数(data Any = IsString String | IsInt Int | IsUndefined ),我想知道我是否可以使用a -> Any优雅地完成它,或者是否有人可以提出另一种方法?

2 个答案:

答案 0 :(得分: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子句,所以它通常不是问题。

答案 1 :(得分:1)

您可以使用类型类:

class ToAny a where
  toAny :: a -> Any

instance ToAny Int where
  toAny = IsInt

instance ToAny String where
  toAny = IsString

对于另一种情况,你可能不会在其他类型的值上调用该函数 - 它会减少代码。