那麼,推導出Eq
而不是自制的不區分大小寫的實例是否合理呢?
這種取決於你想要什麼。我相信該軟件包的作者有他們的理由爲Eq
實例。
另外,如果我要使用這個庫,我怎麼能提供我自己的Eq
實例EmailAdress
?
你不能「覆蓋」他們的實例。通常解決這類問題是,你寫你自己的情況下,一個newtype
包裝:
newtype MyEmailAddress = MyEmailAddress EmailAddress
然後你可以自由定義自己平等的版本,可能是由於:
import Data.Char (toLower)
import qualified Data.ByteString.Char8 as DBC (map)
instance Eq MyEmailAddress where
MyEmailAddress (EmailAddress a1 d1) == MyEmailAddress (EmailAddress a2 d2)
= DBC.map toLower a1 == DBC.map toLower a2 && DBC.map toLower d1 == DBC.map toLower d2
,而我在這,讓我提你甚至可以定義圖案代名詞,這使得一切都好得多:
{-# LANGUAGE PatternSynonyms #-}
pattern Email address domain = MyEmailAddress (EmailAddress address domain)
然後,您可以使用Email "yourName" "yourDomain"
輕鬆製作您的一封電子郵件,以及模式匹配。該Eq
情況看起來更好了很多與此:
instance Eq MyEmailAddress where
Email a1 d1 == Email a2 d2
= DBC.map toLower a1 == DBC.map toLower a2 && DBC.map toLower d1 == DBC.map toLower d2
你可能會考慮使用標準化的情況下,而不是使用原始'EmailAddress'構造一個聰明的構造函數。 – chepner
@chepner ...或雙向模式同義詞。然後甚至可以模式匹配。 – Alec