gpt4 book ai didi

haskell - 如何重写派生的 Eq 实例?

转载 作者:行者123 更新时间:2023-12-02 18:57:32 25 4
gpt4 key购买 nike

我想知道为什么 email-validate包导出以下代码中的 Eq:

data EmailAddress = EmailAddress ByteString ByteString
deriving (Eq, Ord, Data, Typeable, Generic)

我的意思是,我一直使用 Text 作为电子邮件地址,直到我意识到我需要使它们不区分大小写(所以我不保存 Example@ex.ampleexample@ex.ample 作为 2 个不同的地址),所以我到达这个库只是发现它派生 Eq

那么,导出Eq而不是自制的不区分大小写的实例是否合理?另外,如果我要使用这个库,我如何为 EmailAdress 提供自己的 Eq 实例?

最佳答案

So, is it reasonable to derive Eq instead of a self-made case-insensitive instance?

这取决于你想要什么。我确信该包的作者对这个 Eq 实例有他们的理由。

Also, if i were to use this library, how could i provide my own Eq instance for 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

关于haskell - 如何重写派生的 Eq 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40642954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com