Haskell- Определение функции с гвардией

Я довольно новичок в Haskell и сейчас работаю над заданием, имитирующим шашки. У меня возникли трудности с определением правильного метода условной проверки выражения и обновления значений кортежа. У меня есть функция getPos, которая будет возвращать символ в определенном месте на доске, чтобы определить его состояние.

    onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])

    onemove     (a,b,c,(d,e)) 
       | e <= 0 =(a-30,b,c)
       | e > 50 =(a-30,b,c)
       | (((posTo == 'r') || (posTo == 'i')) &&((posFrom == 'w')||(posFrom == 'k'))) == 'true'  =(a-20,b,c)
       | (((posTo == 'w')||(posTo == 'k')) && ((posFrom == 'r') || (posFrom == 'i')))== 'true' =(a-20,b,c)
       | otherwise = (1000,b,c)
       where posFrom = getPos (d, c)
             posTo =  getPos (e,c)

Правильно ли использовать функцию для определения переменной в моем предложении where? Я получаю следующую ошибку в моей последней строке:

    parse error on input `='

1 ответ

Решение

Ваша непосредственная проблема в основном вызвана отступом. Охранники должны иметь отступ в соответствии с определением, с которым они связаны.

onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])
onemove     (a,b,c,(d,e)) 
  | e <= 0 =(a-30,b,c)
  | e > 50 =(a-30,b,c)
  | (((posTo == 'r') || (posTo == 'i')) &&((posFrom == 'w')||(posFrom == 'k'))) =(a-20,b,c)
  | (((posTo == 'w')||(posTo == 'k')) && ((posFrom == 'r') || (posFrom == 'i'))) =(a-20,b,c)
  | otherwise = (1000,b,c)
  where posFrom = getPos (d, c)
        posTo =  getPos (e,c)

Обратите внимание, я также удалил == 'true' в вашем оригинальном коде. Это было неправильно по трем отдельным причинам.

  1. Одинарные кавычки обозначают Char. Двойные кавычки для строки.
  2. Вы не можете сравнить логическое значение со строкой только потому, что эта строка говорит "true". Вы должны сказать == True,
  3. Там нет причин, чтобы написать bool == Trueпотому что это точно так же, как просто писать bool,

Также, a, b, c, а также (d,e) Вероятно, все они должны быть отдельными аргументами, а не одним кортежем. Вы теряете все преимущества карри таким образом.

Другие вопросы по тегам