Как сделать func.в Ocaml, который принимает два логических значения и символ (операция), а затем возвращает соответствующее логическое значение - PullRequest
0 голосов
/ 13 апреля 2019

Как я могу написать функцию в Ocaml, которая будет принимать два логических значения (например, a и b, которые будут представлять логические значения 0 и 1) и символ, который будет определять операцию между этими двумя логическими значениями?Затем функция возвращает true или false, в зависимости от ввода соответствующих логических значений.

В этом коде есть как семантическая, так и синтаксическая ошибка;ну, может быть, есть и другие, но компилятор только подал жалобу об этом:

строка 2, символы 27-30: ошибка: это выражение имеет тип char, но ожидалось выражение типа bool

Это то, что сказал компилятор о коде, и вот что я написал:

let logic (a, b) operation = match operation with
| true -> if (operation == 'A') then match (a,b) with
      | (true, true) -> true
      | _ -> false
      else if (operation == '0') then match (a,b) with
      | (false,false) -> false
      | _ -> true
      else if (operation == 'X') then match (a,b) with
      | (true,true) -> false
      | (false,false) -> false
      | _ -> true
      else if (operation == 'I') then match (a,b) with
      | (true, false) -> false
      | _ -> true
      else then match (a,b) with
      | _ -> false

| false -> end;;

logic (a,b) 'A';;

--------------------------------------------------------------------------

Хорошо, я добился некоторого прогресса, по крайней мере, теперь он компилируется.Однако, я все еще получаю сообщение об ошибке, когда я пытаюсь вызвать «логическую» функцию с этой строкой:

logic (true, false) 'A';;

Ошибка гласит:

Ошибка: это выражение имеет тип bool Этоне функция;оно не может быть применено.

Вот что я написал сейчас:

let logic (a, b) operation = match operation with
| 'A' -> (match (a,b) with
          | (true, true) -> true
          | _ -> false
          )
| '0' -> (match (a,b) with
          | (false,false) -> false
          | _ -> true
          )
| 'X' -> (match (a,b) with
          | (true,true) -> false
          | (false,false) -> false
          | _ -> true)
| 'I' -> (match (a,b) with
          | (true, false) -> false
          | _ -> true
          )
| _ -> (match (a,b) with
        | _ -> false
        )

1 Ответ

1 голос
/ 13 апреля 2019

Чтобы немного расширить комментарий @ Elan-Hamburger.

У вас есть это:

match operation with
| true -> ...

Но ваш operation - это персонаж.Так что это не сработает.Вы можете сопоставлять operation только с определенными символами.

Это особенно странно, поскольку позже вы сравниваете operator с различными символами, используя ==.Но совпадение сделает это за вас.

Другими словами, у вас может быть что-то вроде этого:

match operation with
| 'A' -> ...
| '0' -> ...
| 'X' -> ...
| 'I' -> ...
| _ -> ...

Есть много других проблем с вашим кодом.Вот некоторые комментарии:

У вас есть вложенные операторы совпадения, для правильной работы которых требуются скобки.Если вы попытаетесь вложить без круглых скобок, вы не сможете определить, когда закончилось внутреннее совпадение, и даны дополнительные альтернативы (начиная с |) внешнего совпадения.

Вложенные операторы соответствия выглядят так:

match expr with
| X ab ->
    (match ab with
    | A -> 4
    | B -> 2
    )
| Y _ -> 0

(Вы также можете использовать begin / end вместо скобок, если предпочитаете внешний вид.)

Вы используете == для сравнения значений.Обычный оператор сравнения равенства равен =.Специальный оператор == следует использовать только тогда, когда у вас есть для этого особая причина.

У вас есть код, который выглядит следующим образом:

else then match ...

Это не может быть синтаксически правильным.Возможно, then осталось от редактирования.

Вы можете упростить это выражение

match (a, b) with
| _ -> false

до этого более простого выражения:

false

Обновить

Я не могу воспроизвести вашу новую сообщенную проблему.На самом деле ваш новый код работает нормально для меня в двух быстрых тестах.

. . .
val logic : bool * bool -> char -> bool = <fun>
# logic (true, false) 'A';;
- : bool = false
# logic (true, true) 'A';;
- : bool = true

Возможно, в вашем сеансе верхнего уровня был какой-то посторонний ввод (или посторонние определения).Я предлагаю просто попробовать снова с новым сеансом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...