gpt4 book ai didi

haskell - 使用元组时的实例声明非法

转载 作者:行者123 更新时间:2023-12-02 12:15:56 24 4
gpt4 key购买 nike

在 Haskell 中闲逛,更深入地了解类型类,但我遇到了一些障碍。无论出于何种原因,我都不允许创建我的 Vector 类的实例。有人告诉我这是非法的实例声明,因为我没有不同的类型变量?这是怎么回事?

class Vector v where
vplus :: v -> v -> v
vmult :: Num a => v -> a -> v

instance Num a => Vector (a, a) where
(a, b) `vplus` (c, d) = (a + c, b + d)
(a, b) `vmult` m = (a * m, b * m)

最佳答案

(a,a) 实例中的

a 将是一个任意 Num 实例。 vmult::Num a => v -> a -> v 中的 a 对此一无所知,即这可能是任何其他 Num 实例。

要使类(class)顺利进行,您需要执行以下任一操作

  • 确保数字类型可以相互转换。例如,

    class Vector v where
    vplus :: v -> v -> v
    vmult :: RealFrac a => v -> a -> v

    instance RealFrac a => Vector (a, a) where
    (a, b) `vplus` (c, d) = (a + c, b + d)
    (a, b) `vmult` m' = (a * m, b * m)
    where m = realToFrac m'
  • 确保标量乘法器实际上与向量分量的类型相同。 vector-space就是这样的图书馆就是这么做的。对于您的代码,它将采用以下形式

    {-# LANGUAGE TypeFamilies, FlexibleInstances #-}

    class Vector v where
    type Scalar v :: *
    vplus :: v -> v -> v
    vmult :: v -> Scalar v -> v

    instance Num a => Vector (a, a) where
    type Scalar (a,a) = a
    (a, b) `vplus` (c, d) = (a + c, b + d)
    (a, b) `vmult` m = (a * m, b * m)

关于haskell - 使用元组时的实例声明非法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34417076/

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