Написать функцию, которая принимает на вход список булевых значений, количество элементов в котором кратно трем, и возвращает значение, полученное путем последовательного применения операции «условная дизъюнкция» к k-й тройке элементов списка (k-я тройка — это тройка элементов с номерами k, k+1 и k+2, k = 1,3,...,n-2). Результатом применения операции к k-й паре элементов становится (k+2)-й элемент промежуточного списка. Приведите три примера использования функции.
Я пробовал следующее, но это не работает.
calc::[Bool]->Bool
calc [] = False
calc (p:[]) = False
calc (p:q:[]) = False
calc (p:q:r:[]) = ((not q||p)&&(q||r))
calc (p:q:r:xs) = calc(((not q||p)&&(q||r)):r:xs)
Компилятор говорит следующее.
21.hs:3:19: parse error on input ‘=’
Какой компилятор? Какая версия?





Ваш отступ неверен - у вас есть отдельные реализации функций для ваших шаблонов, поэтому каждая из них должна начинаться со столбца 0:
calc::[Bool]->Bool
calc [] = False
calc (p:[]) = False
calc (p:q:[]) = False
calc (p:q:r:[]) = ((not q||p)&&(q||r))
calc (p:q:r:xs) = calc(((not q||p)&&(q||r)):r:xs)
См. Изучите Haskell: синтаксис в функциях
TY, наконец-то работает
Если оно кратно трем, то почему мы каждый раз перемещаем курсор на два шага?