Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么原因导致Haskell中的复数Ord实例出现此错误?_Haskell_Compare - Fatal编程技术网

是什么原因导致Haskell中的复数Ord实例出现此错误?

是什么原因导致Haskell中的复数Ord实例出现此错误?,haskell,compare,Haskell,Compare,我正在尝试在Haskell中实现复数的Ord实例。我遵循了我在网上找到的实现Ord实例的格式,但是我得到了一个我不理解的错误。以下是我的实例代码: instance Ord Complex where compare (Com x1 y1) (Com x2 y2) | (sqrt ((x1^2)+(y1^2))) < (sqrt ((x2^2)+(y2^2)) = -1 | (sqrt ((x1^2)+(y1^2))) == (sqrt ((x2^2)+(y2^2)) = 0

我正在尝试在Haskell中实现复数的Ord实例。我遵循了我在网上找到的实现Ord实例的格式,但是我得到了一个我不理解的错误。以下是我的实例代码:

instance Ord Complex where
 compare (Com x1 y1) (Com x2 y2) 
  | (sqrt ((x1^2)+(y1^2))) < (sqrt ((x2^2)+(y2^2)) = -1 
  | (sqrt ((x1^2)+(y1^2))) == (sqrt ((x2^2)+(y2^2)) = 0 
  | otherwise = 1

但是我看到的所有Ord实例都使用相同的格式。这是什么错误?

两个子句中的括号都不平衡。两个子句中都缺少一个不平衡的括号。您缺少一个接近的参数。

您的代码存在多个问题

  • 有充分的理由不给复数一个
    Ord
    实例。您试图定义的一个会产生非常违反直觉的结果,如
    -2>-1
    。一个更合理的实例只是比较真实的部分,但如果它们相等,这是有问题的。
    总之,这是一个您最好不要定义的实例
  • 你的条款太复杂了

    • 在一个不等式的两边取一个值(如
      (^2)
      所保证的值为正值)没有区别

      compare (Com x1 y1) (Com x2 y2) 
        | ((x1^2)+(y1^2)) < ((x2^2)+(y2^2) = -1 
        | ((x1^2)+(y1^2)) == ((x2^2)+(y2^2) = 0 
      
      好的,在这一点上,编译器抱怨的问题是很明显的:缺少两个结束参数。或者更确切地说,你有太多的开始参数,因为这些都不是实际需要的(
      infix 4==
      绑定甚至比
      +
      弱)

      但是这些防护措施非常标准,您不需要将它们写出来:只需在
      r
      值上再次调用
      compare
      (已经定义的
      Double
      实例):

      compare (Com x₁ y₁) (Com x₂ y₂) = compare r₁ r₂
       where r₁ = x₁^2 + y₁^2
             r₂ = x₂^2 + y₂^2
      
      您现在还可以再次内联变量:

      compare (Com x₁ y₁) (Com x₂ y₂) = compare (x₁^2 + y₁^2) (x₂^2 + y₂^2)
      

    • 您的代码存在多个问题

    • 有很好的理由不给复数一个
      Ord
      实例。你试图定义的一个实例给出了非常违反直觉的结果,如
      -2>-1
      。一个更合理的实例只会比较真实的部分,但如果它们相等,那就有问题了。
      总之,这是一个实例,你最好不要这样做没有定义
    • 你的条款太复杂了

      • 在一个不等式的两边取一个值(如
        (^2)
        所保证的值为正值)没有区别

        compare (Com x1 y1) (Com x2 y2) 
          | ((x1^2)+(y1^2)) < ((x2^2)+(y2^2) = -1 
          | ((x1^2)+(y1^2)) == ((x2^2)+(y2^2) = 0 
        
        好的,在这一点上,编译器抱怨的问题是很明显的:缺少两个结束参数。或者更确切地说,你有太多的开始参数,因为这些都不是实际需要的(
        infix 4==
        绑定甚至比
        +
        弱)

        但是这些防护措施非常标准,您不需要将它们写出来:只需在
        r
        值上再次调用
        compare
        (已经定义的
        Double
        实例):

        compare (Com x₁ y₁) (Com x₂ y₂) = compare r₁ r₂
         where r₁ = x₁^2 + y₁^2
               r₂ = x₂^2 + y₂^2
        
        您现在还可以再次内联变量:

        compare (Com x₁ y₁) (Com x₂ y₂) = compare (x₁^2 + y₁^2) (x₂^2 + y₂^2)
        

      • 结果应该是
        LT
        EQ
        GT
        ,不?@LouisWasserman最好是:
        实例Ord复合体,其中比较=比较(\(Com x y)->x^2+y^2)
        结果应该是
        LT
        EQ
        GT
        ,不是吗?@LouisWasserman最好是:
        实例Ord复合体,其中compare=comparing(\(Com x y)->x^2+y^2)
        只是为了放大第1点,所有Ord实例都应该遵循一些规律。其中之一是(compare x y==EQ)意味着(x==y),这是你的定义不遵守的。为了进一步说明第1点,所有Ord实例都应该遵循一些定律。其中之一是(compare x y==EQ)暗示(x==y),你的定义不遵守这些定律。
        compare (Com x₁ y₁) (Com x₂ y₂) = compare r₁ r₂
         where r₁ = x₁^2 + y₁^2
               r₂ = x₂^2 + y₂^2
        
        compare (Com x₁ y₁) (Com x₂ y₂) = compare (x₁^2 + y₁^2) (x₂^2 + y₂^2)