haskell - 无法推导出 (Eq a),将 Eq 添加到 typeclass

标签 haskell

我对 Haskell 很陌生,在尝试编译 Frag 时遇到了这个错误。

src/AFRPVectorSpace.hs:51:25:
    Could not deduce (Eq a) arising from a use of `/='
    from the context (VectorSpace v a)
      bound by the class declaration for `VectorSpace'
      at src/AFRPVectorSpace.hs:(32,1)-(53,23)
    Possible fix:
      add (Eq a) to the context of
        the class declaration for `VectorSpace'
    In the expression: nv /= 0
    In the expression:
      if nv /= 0 then v ^/ nv else error "normalize: zero vector"
    In an equation for `normalize':
        normalize v
          = if nv /= 0 then v ^/ nv else error "normalize: zero vector"
          where
              nv = norm v

相关代码:
class Floating a => VectorSpace v a | v -> a where
    zeroVector   :: v
    (*^)         :: a -> v -> v
    (^/)         :: v -> a -> v
    negateVector :: v -> v
    (^+^)        :: v -> v -> v
    (^-^)        :: v -> v -> v
    dot          :: v -> v -> a
    norm     :: v -> a
    normalize    :: v -> v

    v ^/ a = (1/a) *^ v

    negateVector v = (-1) *^ v

    v1 ^-^ _ = v1 ^+^ v1 -- (negateVector v2)

    norm v = sqrt (v `dot` v)

    normalize v = if nv /= 0 then v ^/ nv else error "normalize: zero vector"
        where
        nv = norm v

我的第一个猜测是我需要添加一个 Deriving Eq 或类似的东西,但我不确定我到底需要做什么。

最佳答案

如果您想在默认实现中将 class (Eq a,Floating a) => VectorSpace v a | v -> a 用于 /=,我猜您需要有 a

第二种选择是从类中删除 normalize 并使其成为普通函数。

第三种选择是将约束添加到 normalize 的类型,使其成为 Eq a => v -> v

关于haskell - 无法推导出 (Eq a),将 Eq 添加到 typeclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15491707/

相关文章:

haskell - 如何在 Haskell Data.Tree 中找到节点的路径

haskell - Haskell 是否在编译时扩展了某些 thunk?

Haskell: 'makeNtuple' 函数?

function - GHC API : Find all functions (and their types) in scope

haskell - 管道:多个流消费者

Haskell、Lisp 和冗长

haskell - Haskell 中具有多个参数的新类型

haskell - 了解作家类型

haskell - 查找 snap-server 绑定(bind)的端口

haskell - 如果我们在创建数据类型时导出 Ord 而不是 Eq,会发生什么情况?