2016-03-14 4 views
0

Я попытался сделать функцию, чтобы дать имя квадранта при вводе координат 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 

ответ

4
x=0 

= используется в качестве keyword for definitions. Поскольку вы не можете (и не хотите) определить x, чтобы быть 0, в этот момент вы получите ошибку синтаксического анализа. То, что вы ищете, это функция сравнения. В Haskell это ==, см. Data.Eq.

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

Или вы можете устранить необходимость типа квадрантов, и вместо этого вы можете использовать кортеж (Sign, Sign), который может быть более полезен для следующих шагов.

+0

Вы можете просто использовать 'compare 0' вместо' sign', а также совпадение шаблонов в результирующих значениях 'Ordering'. – chepner

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

 Смежные вопросы

  • Нет связанных вопросов^_^