如何扩展Haskell';在我的班上,她是一个典型的班级

如何扩展Haskell';在我的班上,她是一个典型的班级,haskell,Haskell,我想在我的类型类中扩展showtype类,然后为这两个类提供实现 data XX = XX String --class class Show a => Test a where mySh :: a -> String show :: a -> String instance Test XX where --implementation for both show and mySh mySh (XX a) = a show (XX a) =

我想在我的类型类中扩展showtype类,然后为这两个类提供实现

data XX = XX String --class

class Show a => Test a where
    mySh :: a -> String
    show :: a -> String

instance Test XX where --implementation for both show and mySh
    mySh (XX a) = a
    show (XX a) = "---" ++ a
我得到了这个错误

    • No instance for (Show XX)
    arising from the superclasses of an instance declaration
• In the instance declaration for ‘Test XX’
我只想让Test继承Show(没有默认的实现)并提供它自己的方法。

子类关系
Show a=>testa
(读:
Show
Test
的超类)仅仅意味着作为
Test
实例的任何类型也必须是
Show
的实例,也就是说,基本上就是GHC告诉你的。为此,请编写以下实例:

instance Show XX where
  show (XX a) = "---" ++ a  -- please don't implement it this way, `show`
                            -- is supposed to yield valid Haskell code
instance Test XX where
  mySh (XX a) = a
实际上,
Show
类几乎总是通过一个简单的
派生
语句进行最佳实例化:

data XX = XX String
  deriving (Show)

instance Test XX where
    mySh (XX a) = a
在Haskell中不能做的是“重写”show方法。这是OO语言在子类型上获得不同运行时行为所做的事情,这基本上就是OO子类。子类型,因为它包含的值也可以用作父类的值。但是Haskell没有子类型。您可能更愿意将类视为类型集,
Show
类的子类是具有
Show
实例的类型集的子集。

子类关系
Show a=>testa
(阅读:
Show
Test
的超类)简单地说,作为
Test
实例的任何类型也必须是
Show
的实例,也就是说,GHC告诉您的内容非常准确。为此,请编写以下实例:

instance Show XX where
  show (XX a) = "---" ++ a  -- please don't implement it this way, `show`
                            -- is supposed to yield valid Haskell code
instance Test XX where
  mySh (XX a) = a
实际上,
Show
类几乎总是通过一个简单的
派生
语句进行最佳实例化:

data XX = XX String
  deriving (Show)

instance Test XX where
    mySh (XX a) = a

在Haskell中不能做的是“重写”show方法。这是OO语言在子类型上获得不同运行时行为所做的事情,这基本上就是OO子类。子类型,因为它包含的值也可以用作父类的值。但是Haskell没有子类型。您可能更愿意将类视为类型集,
Show
类的子类是具有
Show
实例的类型集的子集。

XX
类型不可显示。使用
data XX=XX字符串派生(Show)
即使我重写了Show方法,我是否仍然应该使用“派生(Show)”?您不应该调用自己的方法
Show
,因为它已经存在于
Show
类中。请选择另一个名字。重新阅读您的问题和评论,我认为您来自OO背景,并且感到困惑。Haskell类型类与OO类不太相似。特别是,您不能“扩展”它们,当然也不能“重写”方法。如果您想为您的类型编写一个自定义的
show
函数,那么只需编写一个实例:
instance show XX,其中放在一边,
Show
用于调试输出,当您希望将值表示为Haskell表达式时<代码>读取(显示x)
应等于
x
。因此,在实践中,您几乎应该始终使用
派生(Read,Show)
,对于漂亮的打印,使用一个包,例如,创建其
漂亮的
类的实例,如果需要,使用
pretty=viaShow
重用
Show
实例。这提供了更好的性能,而且还有许多很好的格式选项,如缩进和对齐,它们不方便使用
显示
/
显示
XX
类型不可显示。使用
data XX=XX字符串派生(Show)
即使我重写了Show方法,我是否仍然应该使用“派生(Show)”?您不应该调用自己的方法
Show
,因为它已经存在于
Show
类中。请选择另一个名字。重新阅读您的问题和评论,我认为您来自OO背景,并且感到困惑。Haskell类型类与OO类不太相似。特别是,您不能“扩展”它们,当然也不能“重写”方法。如果您想为您的类型编写一个自定义的
show
函数,那么只需编写一个实例:
instance show XX,其中放在一边,
Show
用于调试输出,当您希望将值表示为Haskell表达式时<代码>读取(显示x)
应等于
x
。因此,在实践中,您几乎应该始终使用
派生(Read,Show)
,对于漂亮的打印,使用一个包,例如,创建其
漂亮的
类的实例,如果需要,使用
pretty=viaShow
重用
Show
实例。这提供了更好的性能和许多很好的格式选项,如缩进和对齐,不方便使用
Show
/
ShowS