gpt4 book ai didi

haskell - Haskell : `==' is not a (visible) method of class

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

因此,当我编译以下代码时:

instance (Eq a) => PartOrd a where 
[] == [] = True
(x:xs) == (y:ys) = x==y && xs==ys
_ == _ = False
xs /= ys = not (xs == ys)

我得到:
  `==' is not a (visible) method of class 'PartOrd'

`/=' is not a (visible) method of class 'PartOrd'
Failed, modules loaded: none.

我查看了 How to properly instantiate classes in Haskell?进行了一些澄清,但即使我无法修复它,也无法解决。

另外,当我使用诸如 =~==/~/=的自定义运算符时,是否会出现相同的错误?

编辑:根据要求:
class Eq a => PartOrd a where

partcmp :: a -> a -> Maybe Ordering
partcmp x y = case bigger x y of
True -> Just LT
False -> case smaller x y of
True -> Just GT
False -> case x == y of
True -> Just EQ
False -> Nothing

最佳答案

目前尚不清楚您要实现的目标。这里有一些想法:

  • 当您声明类似instance (Eq a) => PartOrd a的类的实例时,应提供PartOrd a中的功能实现(即partcmp,而不是==/=)。编译器确切地告诉您:==/=Eq类中,不在PartOrd中,并且您没有在PartOrd中进行的业务定义函数。实际上,无论您使用===~还是/~,问题依然存在:您不应该在partcmp中定义除instance (Eq a) => PartOrd a之外的任何内容。 (Eq a) =>部分只是说,在这些定义中,您可以假定已定义类型为==的函数/=(==), (/=) :: a -> a -> a
  • 为什么在实例声明中使用列表?您是否想说instance (Eq a) => PartOrd [a]?如果您真的想说instance (Eq a) => PartOrd a,则需要在GHC中打开FlexibleInstances(也许还有更多其他功能...)。 (但是,使用instance (Eq a) => PartOrd a并没有任何意义。)
  • 最后,函数biggersmaller来自何处?您不能在class (Eq a) => PartOrd a中使用它们,因为a是常规类型。您将需要函数bigger, smaller :: a -> a -> a,在这种情况下,您甚至根本不需要PartOrd类。
  • 关于haskell - Haskell : `==' is not a (visible) method of class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30967119/

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