gpt4 book ai didi

haskell - 实例声明

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

有点好奇为什么下面需要实例声明,因为提供了默认实现。

module Example where

class Eq a => EQ a where
eq :: a -> a -> Bool
eq = (==)

-- why is this instance declaration needed?
instance EQ Int where
eq = (==)

f :: Int -> Int -> Bool
f = eq

如果我省略实例声明,则会收到错误。我确信 Haskell 报告中的某个地方对此进行了解释,但需要一段时间才能找到它。

最佳答案

我认为你是一个类的定义,在 Java/C#/... 中可能更多的是 class .

如果你写:

class Eq a => EQ a where
eq :: a -> a -> Bool
eq = (==)

你只定义一个类型类:一种向类型类添加函数并写入限制的方法。您没有写过每个 Eq aEQ a ...您这样写是为了实现 EQ a ,你必须实现Eq a也是如此(这有点奇怪)。

此外,您还提供了默认实现:eq = (==) ,但这只是您未指定实现的实例的默认实现。

通过写:

instance EQ Int where
eq = (==)

您现在已经定义了 IntEQ 。您可以通过编写以下示例来使实例更有用:

instance Eq a => EQ a

现在您已经编写了所有类型 a其中Eq a成立,也是 EQ 的类型实例。然而,如果你这么写,你就立即定义了 EQ 的整个宇宙。自从在你的class定义,你限制了a成为 EQ 的实例,所以这意味着现在,在整个 Haskell 宇宙中,eq等于(==) .

你可能想说:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}

class EQ a where
eq :: a -> a -> Bool

instance Eq a => EQ a where
eq = (==)

现在您定义了一个类型类 EQ对于每种类型 aEq a ,我们设置eq(==) ,但它允许您定义 EQ也超过其他类型,例如 data Foo这不是 Eq 的实例。请注意,我们必须在这里打开两个扩展。这些是编译器特定的,因此不是标准 Haskell 的一部分。

关于haskell - 实例声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46315857/

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