测试数据类型的规范方法
import Data.Typeable(typeOf)
myFunc :: (Show a) => [a] -> [String]
myFunc
| show (typeOf a) == "[Char]" = ...
| otherwise = ..
我使用上面的代码来测试输入是否属于该String类型。这是正确和可以接受的还是有其他更好的方法?
回答
与匹配值一样,我们更喜欢完全避免使用布尔值。在 typeable/dynamic 的上下文中,这意味着您不应该“测试”它是否是某种特定类型,然后如果是,则执行某些操作,而是(如值模式匹配)您只需尝试将其用作该类型,然后仅在失败时添加回退案例。
myFunc' :: (Show a, Typeable a) => a -> String
myFunc' x = case cast x of
Just xStr -> xStr
_ -> show x
请注意,我什至不需要提及xStr处理 where xis的情况String,因为上下文已经暗示了这一点。