haskell,在类和所有实例中派生Show

时间:2016-03-21 19:35:32

标签: haskell

我班上的签名:

 class (Ord a) => Test a where

我希望能够从班级a的所有实例中显示元素Test 到目前为止,我只使用deriving Show机制来连接数据类型。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

您可以要求其成为Test类型类的一部分,您需要同时拥有Show

  class (Ord a, Show a) => Test a where

然后你可以写一个像

这样的函数
printTest :: Test a => a -> IO ()
printTest a = putStrLn (show a) -- equivalent to print a

因为GHC会推断如果Test a成立,那么Show a也必须。

但是,如果您想为属于Show的每种类型指定新的Test实例,那么这似乎不是您所要求的。可悲的是,你运气不好。你可以想象写一些像

这样的东西
 instance Test a => Show a where
   ...

但是这不能正常工作,特别是它会以最令人不愉快的方式与所有其他实例“重叠”,并试图解决这个问题,只需要在GHC扩展手册中留下2个标签。血压升高。一些库提供了一个函数

 defaultShow :: Test a => a -> String

如果他们定义了一个你希望这样做的类型类,这简化了定义这样一个Show实例的过程,但它并不比简单地使用deriving更简洁。