如果已经提出这个问题我很抱歉。 Show
是一个非常常见的关键字,这使我很难切断噪音。如果我有一个为functor composition
定义的类型,如下所示,我无法弄清楚如何为该类型定义Show
实例:
newtype FComp f g a = C { unC :: f (g a) }
--- Incomplete Show definition for FComp
instance Show (FComp f g a) where
show (C x) = "FComp" ++ show ??? --- Given a type say FComp Maybe Maybe Int, should print out "FComp Maybe Maybe Int"
此外:
$ :t show
show :: Show a => a -> String
因此,似乎show接受一个值,并返回相应的字符串。在x
中插入show ???
将无效,因为Show
实例仍需要为类型f (g a)
定义。
答案 0 :(得分:7)
是的,您只需将其添加为实例的约束
instance (Show (f (g a))) => Show (FComp f g a) where
show (C f) = "FComp " ++ show f
这只是意味着我们有一个FComp
的展示实例,当我们有f (g a)
你也需要启用-XFlexibleContexts
来实现这一点,但我不担心这一点,它只是放宽对GHC允许上下文的限制,而且是非常有争议的。