如果存在(Show a),则返回`show a`;否则,如果(Typeable a),则返回其类型表示

时间:2018-08-27 14:08:26

标签: haskell typeclass

我想写

class Described a where
  describe :: a -> String

instance {-# OVERLAPPING #-} (Show a) => Described a where
  describe = show

instance {-# OVERLAPPABLE #-} (Typeable a) => Described a where
  describe = show . typeOf

这将无效,因为每个实例的右侧相同。我认为可以通过看看https://wiki.haskell.org/GHC/AdvancedOverlap来解决,但似乎我需要为许多现有类型定义实例才能使这些解决方案中的任何一个起作用。什么是最好的解决方案?

1 个答案:

答案 0 :(得分:0)

指导实例选择的标准技巧是创建新类型。所以:

[UNIVERSAL 24]

现在,调用者可以选择自己喜欢的描述类型(如果两者都可用),并且数据类型可以明确表示他们希望对其字段可用的描述类型,从而消除任何魔力。