Почему мое приведение к типу user def не работает? - PullRequest
0 голосов
/ 20 июня 2020
type card = int

type game = { dimension : int; p1 : card list; }

let fn (_dimension : int) (p1 : card list) : bool =
  (int)p1 = (int)_dimension * 2

Я хочу проверить, что p1 ровно в два раза больше размера.

1 Ответ

0 голосов
/ 20 июня 2020

Ваш код не очень похож на код OCaml, поэтому трудно понять, как помочь: -)

В OCaml нет операции по изменению типа значения. Это не имело бы смысла на строго типизированном языке. Есть кое-что, что вы можете делать с типами, но "приведение" к ним не относится.

Итак, не существует допустимого выражения, которое выглядело бы как (int) expr. Как указывает @glennsl, существует функция, которая возвращает длину списка. Если это то, что вы пытаетесь вычислить, вы можете использовать List.length _dimension. Остальные вхождения (int) можно просто удалить. Они недействительны для OCaml.

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

Если вы не укажете все описания типов в своем определении fn, компилятор выведет наиболее общий тип для вашей функции. Это означает, что вы можете вызвать его с любым списком, чтобы проверить его длину. Это было бы больше идиоматии c в OCaml. Т.е. не нужно указывать, что p1 - это список карточек. Функция подходит для любого списка.

...