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'
в вашем оригинальном коде. Это было неправильно по трем отдельным причинам.
- Одинарные кавычки обозначают Char. Двойные кавычки для строки.
- Вы не можете сравнить логическое значение со строкой только потому, что эта строка говорит "true". Вы должны сказать
== True
, - Там нет причин, чтобы написать
bool == True
потому что это точно так же, как просто писатьbool
,
Также, a
, b
, c
, а также (d,e)
Вероятно, все они должны быть отдельными аргументами, а не одним кортежем. Вы теряете все преимущества карри таким образом.