Haskell中的"Subclassing"节目?

me2*_*me2 6 haskell types typeclass

可以说我有以下内容:

data Greek = Alpha | Beta | Gamma | Phi deriving Show
Run Code Online (Sandbox Code Playgroud)

我想使用除Beta之外的所有项目的默认显示,我想说"两个".

我可以这样做吗?

pok*_*oke 17

deriving Show使用标准实例化机制(简单地返回定义).如果你想要任何特殊的东西,你必须手动实例化它:

data Greek = Alpha | Beta | Gamma | Phi

instance Show Greek
    where
        show Alpha = "Alpha"
        show Beta  = "2"
        show Gamma = "Gamma"
        show Phi   = "Phi"
Run Code Online (Sandbox Code Playgroud)


luq*_*qui 7

并不是说这完全令人满意,但你可以做到:

data Greek = Alpha | Beta | Gamma | Phi
    deriving (Show)

showGreek Beta = "2"
showGreek x = show x
Run Code Online (Sandbox Code Playgroud)

并使用showGreek而不是show.如果你需要一个真正的show实例(在我的代码中我发现我需要这个比初学者倾向于认为的少),你可以做相当麻烦的事情:

newtype Greek' = Greek' Greek
instance Show Greek' where
    show (Greek' g) = showGreek g
Run Code Online (Sandbox Code Playgroud)

如果是我的代码,我会坚持下去showGreek.

我使用的一个很好的经验法则是Show和Read实例只是Haskell生成的.如果show不生成有效的Haskell代码,则它不应该在Show实例中.

  • 那不对.Show并不意味着生成Haskell代码,它意味着返回给定数据类型的字符串表示.在这种情况下,只要Show和Read彼此正常工作,用它定义任何你想要的东西确实没问题.同样使用新的`showGreek`函数并没有真正帮助,因为实例化旨在提供一些所有数据类型都可以使用的抽象级别. (4认同)

Mtn*_*ark 3

据我所知,你不能。派生机制无论如何都不支持更改或扩展派生实例。