【发布时间】:2020-06-03 18:46:06
【问题描述】:
我对 Haskell 很陌生,但我想知道如何才能更短地编写以下代码:
data Suite = Club | Heart | Spade | Diamond
data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen |
King | Ace
data Card = Card Suite Value
instance Show Suite where
show Club = "Club"
show Heart = "Heart"
show Spade = "Spade"
show Diamond = "Diamond"
instance Enum Suite where
enumFromTo Club Diamond = [Club, Heart, Spade, Diamond]
enumFromTo Heart Diamond = [Heart, Spade, Diamond]
enumFromTo Club Spade = [Club, Heart, Spade]
instance Show Value where
show Two = "Two"
show Three = "Three"
show Four = "Four"
show Five = "Five"
show Six = "Six"
show Seven = "Seven"
show Eight = "Eight"
show Nine = "Nine"
show Ten = "Ten"
show Jack = "Jack"
show Queen = "Queen"
show King = "King"
show Ace = "Ace"
我想为 Show Value 编写更短的实例。有没有好的方法可以做到这一点,还是我需要全部写出来? 我还想知道如果我想为 Eq Card、Ord Card 定义相同的实例,我该如何从这里开始? 目前为止
instance Eq Card where
Card _ _ == _ = False
instance Ord Card where
Card Heart Three > Card Heart Two = True
工作,但写出每一种可能性将是相当多的工作。 感谢您的任何回答!
编辑:我知道附加派生(显示等)的可能性,但我不想使用它
【问题讨论】:
-
究竟为什么不想使用
deriving? -
只需在
Card上折腾deriving (Show, Eq, Ord)就可以很好地解决它。 -
deriving正是为了节省大量工作,避免出错,而且对于某些类型类,它是Safe Haskell唯一允许的实例。 -
更好地了解haskell
-
您可以使用
Generics 来派生构造函数名称,但这会导致一些额外(且相当复杂)的逻辑。
标签: haskell