在Haskell中,是否有任何方法可以声明函数的行为,具体取决于参数的类型是否为特定类型类的实例?
例如,是否可以在以下示例中定义genericShow
?
-- If type `a` is an instance of `Show`.
genericShow :: Show a => a -> String
genericShow = show
-- If type `a` is not an instance of `Show`.
genericShow :: a -> String
genericShow _ = "(Cannot be shown)"
> genericShow 3
"3"
> genericShow const
"(Cannot be shown)"
答案 0 :(得分:1)
否。
您能获得的最接近的结果是使用重叠实例,对所有没有更具体的Show
实例的对象使用全包实例。
instance {-# OVERLAPPABLE #-} Show a where
show _ = "(Cannot be shown)"
重叠实例附带很多警告:请参见“孤立实例”,“不连贯实例”等主题。对于Prelude
之类的Show
类来说,这尤其尴尬,因为库中可能隐藏了许多实例。
正如@duplode所说,存在许多危险。几乎可以肯定,有一种更好的方法可以实现您认为想要的一切。