2015-07-21 62 views
1
data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun 

的情況如何,我宣佈這個方程的一個實例,而無需使用deriving Eq聲明代數數據類型方程

我必須聲明它像每一個可能性:

instance Eq Weekday where 
        Mon == Mon = True 
        Mon == _ = False 
        _ == Mon = False 
        Tue == Tue = True 
        ... == ... = .. 

還是有更聰明的解決方案?

+4

'派生Eq'是「更智能的解決方案」。否則,是的,你需要定義所有的情況。 – MathematicalOrchid

+0

謝謝你,這是我的問題 – fragant

回答

9

它基本上就是這個,除非你想混淆模板哈斯克爾或GHC的派生機制。

instance Eq Weekday where 
    Mon == Mon = True 
    Tue == Tue = True 
    Wed == Wed = True 
    Thu == Thu = True 
    Fri == Fri = True 
    Sat == Sat = True 
    Sun == Sun = True 
    _ == _ = False 
+3

在這種情況下可能已經足夠了,因爲我們很可能在未來增加一週中的新一天,但這是一個相當危險的模式:使用catch-all情況防止typechecker從警告你如果擴展枚舉需要修改定義。它只會默默地爲這個額外的情況返回'False'。 – gallais

1

可能不是你想要的,但在這種情況下,你可以用Enum來定義Eq。例如:

data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun 

instance Eq Weekday where 
    a == b = fromEnum a == fromEnum b 

枚舉實例可以得出,deriving (Enum),或者你再一次必須做出相當冗長實例聲明很像是弗雷澤表示。