Movement
- это тип, а не значение. Вы не можете использовать это в шаблонах.
Далее, N
и другие конструкторы являются функциями, и вы не можете ==
функций.
Вместо этого вам нужно использовать сопоставление с шаблоном, и забудь охранников.
step :: Movement -> (Int, Int) -> (Int, Int)
step (N h) (y,z) = ...
step (S h) (y,z) = ...
step (W h) (y,z) = ...
step (E h) (y,z) = ...
Кроме того, можно изменить рефакторинг вашего типа:
data Direction = N | S | E | W deriving (Eq, Show)
data Movement = Movement Direction Int deriving (Eq, Show)
step :: Movement -> (Int, Int) -> (Int, Int)
step (Movement x h) (y,z)
| x == N = (y, z+h)
| x == S = (y, z-h)
| x == W = (y-h, z)
| x == E = (y+h, z)
Теперь ваш код работает, поскольку Movement
также является конструктором данных, а N
и его друзья больше не работает. Я все же предпочел бы избегать охранников и использовать
step :: Movement -> (Int, Int) -> (Int, Int)
step (Movement N h) (y,z) = (y, z+h)
step (Movement S h) (y,z) = (y, z-h)
step (Movement W h) (y,z) = (y-h, z)
step (Movement E h) (y,z) = (y+h, z)