Function 象限给定函数的错误

Function 象限给定函数的错误,function,haskell,guard-statement,Function,Haskell,Guard Statement,当输入x和y坐标时,我尝试创建一个函数来给出象限名称。但是,我得到了一个错误: “在输入'='上分析错误” 失败,已加载模块:无。“ 我尝试添加一个“|否则…”,但仍然不起作用。我确保我涵盖了x和y的所有可能性 data Quadrants = Origin | Quadrant_I | Quadrant_II | Quadrant_III | Quadrant_IV | X_Axis_Positive | X_Axis_Neg

当输入x和y坐标时,我尝试创建一个函数来给出象限名称。但是,我得到了一个错误: “在输入'='上分析错误”

失败,已加载模块:无。“

我尝试添加一个“|否则…”,但仍然不起作用。我确保我涵盖了x和y的所有可能性

data Quadrants = Origin |
                 Quadrant_I | Quadrant_II | Quadrant_III | Quadrant_IV |
                 X_Axis_Positive | X_Axis_Negative | Y_Axis_Positive | Y_Axis_Negative
  deriving (Show, Eq)
quadrant :: Float -> Float -> Quadrants
quadrant x y
    |x>0 && y>0 = Quadrant_I
    |x<0 && y>0 = Quadrant_II
    |x<0 && y<0 = Quadrant_III
    |x>0 && y<0 = Quadrant_IV
    |x=0 && y=0 = Origin
    |x>0 && y=0 = X_Axis_Positive
    |x<0 && y=0 = X_Axis_Negative
    |x=0 && y>0 = Y_Axis_Positive
    |x=0 && y<0 = Y_Axis_Negative
数据象限=原点|
象限I |象限II |象限III |象限IV|
X|u轴正| X|u轴负| Y|u轴正| Y|u轴负
推导(显示,等式)
象限::浮点->浮点->象限
象限x y
|x> 0&&y>0=象限I
|x0=象限二
|x
=
用作。由于此时无法(也不希望)将
x
定义为
0
,因此会出现解析错误。你要找的是比较函数。在Haskell中,这是
=
,请参阅


=
用作。由于此时无法(也不希望)将
x
定义为
0
,因此会出现解析错误。你要找的是比较函数。在Haskell中,这是
==
,请参见。

我认为,如果将每个坐标的符号解耦为另一种类型,并在中间类型上进行模式匹配,则可以简化结构,即

data Sign = Negative | Zero | Positive
sign x | x==0 = Zero
       | x>0  = Positive
       | otherwise = Negative
然后

quadrant :: Float -> Float -> Quadrants
quadrant x y = go (sign x) (sign y)
       where go Zero Zero = Origin
                Zero Positive = Y_Axis_Positive
                ...

或者您可以不需要象限类型,而是可以使用元组(符号,符号),这可能对下一步更有用。

我认为,如果您将每个坐标的符号解耦为另一种类型,并在中间类型上进行模式匹配,则可以简化结构,即

data Sign = Negative | Zero | Positive
sign x | x==0 = Zero
       | x>0  = Positive
       | otherwise = Negative
然后

quadrant :: Float -> Float -> Quadrants
quadrant x y = go (sign x) (sign y)
       where go Zero Zero = Origin
                Zero Positive = Y_Axis_Positive
                ...

或者您可以不需要象限类型,而是可以使用元组(符号,符号),这可能对下一步更有用。

这主要是karakfa非常好的答案的重复,只是要指出Haskell提供的数据类型与
符号
同构,即
排序

quadrant :: Float -> Float -> Quadrants
quadrant x y = go (compare x 0) (compare 0 y)
               where go EQ EQ = Origin
                     go EQ GT = Y_Axis_Positive
                     go EQ LT = Y_Axis_Negative
            ...

您的
象限
类型与
排序
值对同构,这意味着您可以编写如下代码

type Quadrant = (Ordering, Ordering)
origin = (EQ, EQ)
quadrant_i = (GT, GT)
-- etc

quadrant :: Float -> Float -> Quadrant
quadrant x y = ((compare x 0), (compare y 0))

这有一个缺点,就是需要一个语言扩展来匹配模式,比如说,
origin
,而不是直接
(EQ,EQ)

这主要是karakfa非常好的答案的重复,只是要指出Haskell提供了一个与
符号
同构的数据类型,即
排序

quadrant :: Float -> Float -> Quadrants
quadrant x y = go (compare x 0) (compare 0 y)
               where go EQ EQ = Origin
                     go EQ GT = Y_Axis_Positive
                     go EQ LT = Y_Axis_Negative
            ...

您的
象限
类型与
排序
值对同构,这意味着您可以编写如下代码

type Quadrant = (Ordering, Ordering)
origin = (EQ, EQ)
quadrant_i = (GT, GT)
-- etc

quadrant :: Float -> Float -> Quadrant
quadrant x y = ((compare x 0), (compare y 0))

这有一个缺点,就是需要一个语言扩展来匹配模式,比如说,
origin
,而不是直接使用
(EQ,EQ)

您可以使用
比较0
来代替
符号,对结果的
排序
值进行模式匹配。您可以使用
比较0
代替
符号
,并对结果的
排序
值进行模式匹配。