我班上的签名:
class (Ord a) => Test a where
我希望能够从班级a
的所有实例中显示元素Test
到目前为止,我只使用deriving Show
机制来连接数据类型。
你能帮帮我吗?
答案 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
更简洁。