函数的行为取决于参数所属的类型类而有所不同

时间:2018-11-19 01:01:00

标签: haskell

在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)"

1 个答案:

答案 0 :(得分:1)

否。

您能获得的最接近的结果是使用重叠实例,对所有没有更具体的Show实例的对象使用全包实例。

instance {-# OVERLAPPABLE #-} Show a  where
  show _ = "(Cannot be shown)"

重叠实例附带很多警告:请参见“孤立实例”,“不连贯实例”等主题。对于Prelude之类的Show类来说,这尤其尴尬,因为库中可能隐藏了许多实例。

正如@duplode所说,存在许多危险。几乎可以肯定,有一种更好的方法可以实现您认为想要的一切。