Проблема в том, что :
в начале функции обозначает конструктор данных; это как начать с заглавной буквы. Вы должны переименовать :&:
во что-то вроде |&|
.
Редактировать: Неважно, я только что понял, что вы на самом деле пытаетесь достичь.
Предполагается, что :&:
займет два MyBool
с и создаст Formula
вместо другого MyBool
. Вы пытались реализовать :&:
как функцию; это конструктор данных. Вы уже объявили это в выражении data Forumla = ...
.
Вам вообще не нужно объявление функции. Полностью удалите следующий блок кода:
infixr 3 :&:
(:&:) :: MyBool -> MyBool -> MyBool
Cierto :&: x = x
Falso :&: x = Falso
После этого вы сможете использовать :&:
, чтобы взять два MyBool
s и создать Formula
без добавления какого-либо другого кода.
Однако, действительное действие :&:
на MyBool
s не является достаточно общим. Мы хотим иметь возможность объединять выражения и логические выражения. Таким образом, вы действительно хотите, чтобы :&:
объединял Formula
с. Это то, что ваш код уже делает. То, что вам не хватает, это конструктор типа Literal
, который принимает MyBool
и возвращает Formula
, представляющий это логическое значение.