0

在输入 x 和 y 坐标时,我尝试创建一个函数来给出象限名称。但是,我收到错误消息:“输入 '=' 上的解析错误</p>

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

我尝试添加一个“|otherwise..”,但这仍然不起作用。我确保我涵盖了 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
4

3 回答 3

4
x=0

=用作定义的关键字。由于此时您不能(也不想)定义x0,因此会出现解析错误。您正在寻找的是比较功能。在 Haskell 中,这是==,请参阅Data.Eq

于 2016-03-14T19:45:40.573 回答
1

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

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
                ...

或者您可以消除对 Quadrants 类型的需要,而可以使用元组 (Sign, Sign),这可能对后续步骤更有用。

于 2016-03-14T20:42:57.917 回答
0

这主要是 karakfa 非常好的答案的副本,只是为了指出 Haskell 带有一个与 同构的数据类型Sign,即Ordering.

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
            ...

您的Quadrants类型与值对同构Ordering,这意味着您可以编写如下代码

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)直接匹配。

于 2016-03-14T21:25:24.407 回答