【问题标题】:Defining Show for functor composition为函子组合定义 Show
【发布时间】:2014-04-25 18:48:33
【问题描述】:

如果这个问题已经被问到,我深表歉意。 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 ??? 将不起作用,因为仍需要为f (g a) 类型定义Show 实例。

【问题讨论】:

  • newtype FComp f g a = C { unC :: f (g a) } deriving Show;如果您有兴趣,请使用 GHC 的 -ddump-deriv 标志查看它生成的代码。
  • 不应该显示值,而不是类型吗?

标签: haskell composition functor typeclass


【解决方案1】:

是的,您只需将其添加为实例的约束

instance (Show (f (g a))) => Show (FComp f g a) where
  show (C f) = "FComp " ++ show f

这只是意味着我们有一个 FComp 的显示实例,而我们有一个 f (g a) 的显示实例

您还需要启用 -XFlexibleContexts 才能使其工作,但我不会担心这一点,它只是放宽了对 GHC 允许的上下文的限制,并且没有争议。

【讨论】:

  • 不应该是show (C f) = "FComp" ++ show fghci 告诉我我需要启用FlexibleContexts
  • @dg123,是的。继续并启用 FlexibleContexts——它是常见的扩展之一。
  • @dg123 是的,是的,不用担心灵活上下文,它只是放宽了一个相当随意的限制
猜你喜欢
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
相关资源
最近更新 更多