我有一个数据类型,我用来表示wxHaskell中的wxAny对象,目前我只支持包含wxAny
或String
的{{1}}个,因此:
Int
我需要一个函数(data Any
= IsString String
| IsInt Int
| IsUndefined
),我想知道我是否可以使用a -> Any
优雅地完成它,或者是否有人可以提出另一种方法?
答案 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
对于另一种情况,你可能不会在其他类型的值上调用该函数 - 它会减少代码。