Function 象限给定函数的错误
当输入x和y坐标时,我尝试创建一个函数来给出象限名称。但是,我得到了一个错误: “在输入'='上分析错误” 失败,已加载模块:无。“ 我尝试添加一个“|否则…”,但仍然不起作用。我确保我涵盖了x和y的所有可能性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
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
代替符号
,并对结果的排序
值进行模式匹配。