gpt4 book ai didi

Haskell:具有类类型参数的类实例

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

再会。我是 Haskell 的新手。关于声明和实例化一些自定义类,我不清楚一件事。

  • 有标准类Integral在 haskell 。根据黑客攻击,Integral声明强制方法 quot :: a -> a -> a .所以这意味着该类的每个实例都应该有这个方法实现,对吧?
  • 我们可以声明一些函数,使用 Integral 作为参数,例如:

  • proba :: (Integral a) => a -> a -> a
    proba x y = x `quot` y

    到目前为止,一切都很好
  • 现在让我们声明我们自己的 Proba 类:

  • class Proba a where
    proba :: a -> a -> a

    我可以像这样实现一个 Int 或 Integer (或其他数据类型)实例:

    instance Proba Integer where
    proba x y = x `quot` y

    instance Proba Int where
    proba x y = x `quot` y

    但我不想。 我想要每个积分都有一个实例。 但是当我尝试这样做时,我得到一个错误:

    instance (Integral a) => Proba a where
    proba x y = x `quot` y

    Illegal instance declaration for `Proba a'
    (All instance types must be of the form (T a1 ... an)
    where a1 ... an are *distinct type variables*,
    and each type variable appears at most once in the instance head.
    Use FlexibleInstances if you want to disable this.)
    In the instance declaration for `Proba a'

    好的,它似乎要求我提供不同的类型变量而不是类。但为什么?!为什么仅仅拥有一个 Integral 还不够?这里?由于 quot为每个 Integral 声明, 这个实例应该对每个 Integral 都有效,不是吗?

    也许有办法达到同样的效果?

    最佳答案

    如错误消息所示,您可以使用 FlexibleInstances (一个相当常见和安全的扩展)来允许这种行为,但你还需要 UndecidableInstances :

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

    class Proba a where
    proba :: a -> a -> a

    instance Integral a => Proba a where
    proba = quot

    默认情况下不启用它的原因是因为它是专门的 GHC 扩展,而不是 Haskell98 规范的一部分。您会发现有很多语言扩展非常有用且使用安全,而且通常您只希望在特定模块中启用它们。不仅要问“为什么不是默认设置”,还要问“我什么时候不希望这是默认设置?”。

    另一种在没有扩展的情况下实现这一点的方法是将类型类直接编码为数据类型:
    data Proba a = Proba
    { proba :: a -> a -> a
    }

    integralProba :: Integral a => Proba a
    integralProba = Proba quot

    然后你可以把它作为
    foldProba :: Proba a -> a -> [a] -> a
    foldProba p = foldr (proba p)

    那么如果你有 foldProba integralProba ,然后它会自动将类型限制为 Integral a => a -> [a] -> a .

    关于Haskell:具有类类型参数的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25768821/

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