gpt4 book ai didi

Haskell 重写函数

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

我尝试编写一个函数来检查两个向量是否相等:

Compare Vec1 [1, 2, 3]   Vec1 [1, 2, 4]
Compare VecS ["a","b", "c"] VecS ["a", "b", "d"]

但是,在我的函数中,两种情况的实现“几乎”相同,

有没有一种方法可以简化我的代码,使其只有一个整数和字符串的实现

data MyVector = Vec1 [Integer] | VecS[String]  

eqAssert::MyVector->MyVector->Bool
eqAssert (Vec1 []) (Vec1 []) = True
eqAssert (Vec1 _) (Vec1 []) = False
eqAssert (Vec1 (x:cx)) (Vec1 (y:cy)) =
if length (x:cx) /= length (y:cy)
then False
else (if x /= y then False else eqAssert (Vec1 cx) (Vec1 cy))

eqAssert (VecS []) (VecS []) = True
eqAssert (VecS _) (VecS []) = False
eqAssert (VecS (x:cx)) (VecS (y:cy)) =
if length (x:cx) /= length (y:cy)
then False
else (if x /= y then False else eqAssert (VecS cx) (VecS cy))

最佳答案

我认为您的目标是自己做太多工作。 Haskell 有一个 Eq类型类和相等性检查 (==) :: Eq a => a -> a -> a功能。

此外,在 Haskell 中,每个 a这样Eq a成立,这也意味着 Eq [a]成立。在这种情况下,对列表进行相等性检查,使得两个列表相等,因为它们具有相同数量的元素,并且如果我们并行枚举两个列表,则第一个列表中的每个元素都等于另一个列表中的相应元素列表。

所以我们可以简化这个函数:

eqAssert :: MyVector -> MyVector -> Bool
eqAssert (Vec1 a) (Vec1 b) = a == b
eqAssert (VecS a) (VecS b) = a == b
eqAssert _ _ = False

所以该函数有三个子句。第一个涉及两个 Vec1 s,在这种情况下我们检查两个列表 a 的相等性和b 。第二个子句几乎相同,只是我们检查两个 VecS s。最后我们使用eqAssert _ _ 。这里_是一个通配符:它匹配所有内容。其余模式为 (Vec1 a) (VecS b)(VecS a) (Vec1 b)不管怎样ab是,我们只需返回 False在这种情况下。

实现 eqAssert 也有点奇怪。这里。我们可以自动使其成为 Eq 的实例,在这种情况下 Haskell 将实现 (==) MyVector 的功能自动地。所以我们可以这样写:

data MyVector = Vec1 [Integer] | VecS[String] <b>deriving Eq</b>

然后使用 myvec1 == myvec2相反。

关于Haskell 重写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49217768/

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