gpt4 book ai didi

haskell - 我可以在不使用 Eq 的情况下使用 == 和/= 吗?

转载 作者:行者123 更新时间:2023-12-01 01:25:40 25 4
gpt4 key购买 nike

所以我写了这个程序,一切正常;)
我想改进它。我还可以使用/= 编译两个不同的时间集,结果为 True。
我有点困惑。

data Time = Localtime {hour, minute :: Int}
| Globaltime {hour, minute, difference :: Int}
| LocaltimeAM {hour, minute :: Int, am :: Bool}
deriving Show

same :: Time -> Time -> Bool
same u1 u2 = (h u1) == (h u2)
where
h :: Time -> (Int, Int) -- (Int, Int) = (hour, minute)
h (Localtime h m) = (h, m)
h (Globaltime h m d) = ((h+d+24) `mod` 24, m)
h (LocaltimeAM h m am) = (h + (if am then 0 else 12), m)

最佳答案

回答标题中的问题:

Can I use == and /= without using Eq?



您可以 - 从技术上讲 - 明确隐藏 Eq前奏中的typeclass,然后定义一个 (==)(/=)自己使用函数,但那将是一个坏主意,因为这意味着您不能再将两个整数与 (==) 进行比较。 .

您可能想要的是制作 Time Eq 的一个实例typeclass,这样你就可以从现在开始写 time1 == time2 .我们可以使它成为一个实例,例如:
h :: Time -> (Int, Int) -- (Int, Int) = (hour, minute)
h (Localtime h m) = (h, m)
h (Globaltime h m d) = ((h+d+24) `mod` 24, m)
h (LocaltimeAM h m am) = (h + (if am then 0 else 12), m)

instance Eq Time where
t1 == t2 = (h t1) == (h t2)

Haskell 会自动写入 (/=)我们的函数(与 (==) 相反),或者您可以决定编写 (/=)版本,然后 Haskell 会写 (==)版本。当然,您也可以同时实现两者。

使类型成为类型类的成员实际上很有用。以 nub :: Eq a => [a] -> [a] 为例功能。它要求类型 aEq的成员(member)typeclass,并执行某种“唯一性”过滤器:您为其提供一个元素列表,它返回一个不相等元素的列表。现在无需任何工作来定义 nub功能为您 Time类型,通过制作 Time Eq 的一个实例类型类,您可以使用 nubTime 的列表中s。

当然,您不能简单地使类型成为所有可能类型类的实例。你应该只让类型成为 Eq 的实例typeclass 是否可以检查两个项目是否相同(因此当两个项目相等时应该有一个“合理”的想法)。此外,这些类型类中的大多数都带有“契约”:例如,相等关系(如由 (==) 定义的)应该是自反的、对称的和可传递的。

关于haskell - 我可以在不使用 Eq 的情况下使用 == 和/= 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51615557/

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