gpt4 book ai didi

haskell - 在 Haskell 中为自定义数据类型创建 Eq 实例

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

我已经在 Haskell 中为数字表示制作了一些自定义数据类型,现在我想为其实现 Eq 实例,但我不知何故陷入困境。所以我已经做了:

data Digit = Zero | One | Two
type Digits = [Digit]
data Sign = Pos | Neg -- Pos fuer Positive, Neg fuer Negative
newtype Numeral = Num (Sign,Digits)

instance Eq Sign where
(==) Pos Pos = True
(==) Neg Neg = True
(==) _ _ = False

instance Eq Digit where
(==) Zero Zero = True
(==) One One = True
(==) Two Two = True
(==) _ _ = False

现在我想检查我的自定义类型数字中的登录,所以我尝试了以下方法:

instance (Eq Sign) => Eq (Numeral) where
(==) Num(x,_)== Num(y,_) = x==y

但我收到此错误:模式中的解析错误:(==)

最佳答案

主要是将我在评论中已经写过的内容以更充实的形式呈现出来:

您的代码存在一些问题:

  1. 您必须缩进instance 声明下的代码。这样您就可以告诉编译器哪些代码属于实例声明。
  2. 在下面的行中,您要求对具体类型进行类型类约束 (Eq Sign =>)。这在标准 Haskell 中是不可能的,即使您遵循编译器说明并启用 FlexibleInstances 语言扩展,它也没有意义。

    instance (Eq Sign) => Eq (Numeral) where

    类型类约束仅用于类型变量。例如:

    double :: Num a => a -> a
    double x = x + x

    这里我们说,函数double仅适用于所有实现Num的类型。另一方面, double::Num Int => Int -> Int 是多余的,因为我们已经知道 Int 有一个 Num 实例。 Eq Sign 也是如此。

    对于实例来说,只有当您为其编写实例的类型包含另一个多态类型时,此类约束才有意义。 Fox 示例 instance Ord a => Ord [a]。在这里,我们将使用列表元素的 Ord 实例来按字典顺序对列表进行排序。

  3. 您可以以中缀或前缀形式定义 (==),但不能同时使用两者。因此,要么 (==) (Num (x,_)) (Num (y,_)) = x == yNum (x,_) == Num (y, _) = x == y.

  4. 通过新建元组来创建产品类型是相当奇怪的。如果您想使用更复杂的基础类型已经存在的功能,通常会使用新类型。但这里的情况并非如此,您只需要 DigitsSign 的正常乘积。

  5. 您只是比较数字的符号。虽然从技术上讲是一个有效的 Eq 实例,但我认为您还想比较可能截断前导零的数字的数字。不过,为了简单起见,在下面的代码中我没有截断零。

data Digit = Zero | One | Two
type Digits = [Digit]
data Sign = Pos | Neg
data Numeral = Num Sign Digits

instance Eq Sign where
(==) Pos Pos = True
(==) Neg Neg = True
(==) _ _ = False

instance Eq Digit where
(==) Zero Zero = True
(==) One One = True
(==) Two Two = True
(==) _ _ = False

instance Eq Numeral where
Num s1 x1 == Num s2 x2 = s1 == s2 && x1 == x2

关于haskell - 在 Haskell 中为自定义数据类型创建 Eq 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695023/

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