为仿函数组合定义Show

时间:2014-04-25 18:48:33

标签: haskell composition functor typeclass

如果已经提出这个问题我很抱歉。 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)定义。

1 个答案:

答案 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允许上下文的限制,而且是非常有争议的。