Haskell 输入“=';上的分析错误;。哈斯克尔

Haskell 输入“=';上的分析错误;。哈斯克尔,haskell,Haskell,我在Haskell中定义了以下类 class Ord a => X a where r :: (a, a) -> [a] instance (X a, X b) => X (a,b) (*)r ((a,b), (c,d)) = r' ((a,b), (c,d)) b where r' ((a, b), (c,d)) b' | a == c && b == d = (a,b)

我在Haskell中定义了以下类

class Ord a => X a where 
    r :: (a, a) -> [a]        


instance (X a, X b) => X (a,b)
    (*)r ((a,b), (c,d)) = r' ((a,b), (c,d)) b where
        r' ((a, b), (c,d)) b'
            | a == c && b == d = (a,b)
            | b < d = (a,b) : (r' ((a, succ b), (c, d)) b')
            | otherwise = (a,b) : (r' ((succ a, b'), (c,d)) b')
class Ord a=>xa其中
r::(a,a)->[a]
实例(xa,xb)=>X(a,b)
(*)r((a,b)、(c,d))=r'((a,b)、(c,d))b其中
r'((a,b)、(c,d))b'
|a==c&&b==d=(a,b)
|b
我在第(*)行的输入上得到错误
解析错误

我不知道如何修理它。请帮帮我。

应该是

instance C T where
   foo = bar where
      bar = ...

缺少第一个
,其中

我可以看到一些错误:

  • 这是不正确的:
    (*)r((a,b),(c,d))
    。也许你的意思是:
    r((a,b),(c,d))
    OP用这个术语来表示行
  • 您的实例定义缺少关键字
    where
    。应该这样定义:
    实例(xa,xb)=>X(a,b),其中
  • 函数
    r
    的类型表示它返回一个列表
    [a]
    。但是在
    r'
    定义的第一个子句中,返回的元组不正确。也许,您想这样做:

      r' ((a, b), (c,d)) b'
          | a == c && b == d = [(a,b)]
    
  • 由于您正在使用函数
    succ
    ,因此类型变量
    a
    b
    应为
    Enum
    实例

修复上述所有错误后,将给出以下类型检查代码:

instance (X a, Enum a, Enum b, X b) => X (a,b) where
    r ((a,b), (c,d)) = r' ((a,b), (c,d)) b 
        where
          r' ((a, b), (c,d)) b'
              | a == c && b == d = [(a,b)]
              | b < d = (a,b) : (r' ((a, succ b), (c, d)) b')
              | otherwise = (a,b) : (r' ((succ a, b'), (c,d)) b')
实例(xa,枚举a,枚举b,xb)=>X(a,b),其中
r((a,b)、(c,d))=r’((a,b)、(c,d))b
哪里
r'((a,b)、(c,d))b'
|a==c&&b==d=[(a,b)]
|b
这是什么意思:
(*)r((a,b),(c,d))
?这似乎不正确。我猜他是想标记错误消息所指的行。@d8d0d65b3f7cf42谢谢,我现在明白了。如果不是这样表示的话会更好,因为它非常混乱!是的,但我确实认为给出一个提示比一个完整的解决方案更有用。那家伙只是问语法错误。