Я очень новичок в OCaml, но работал все последние два дня, чтобы понять, как его использовать.
В последнее время я много чего делал, но что-то мешает мне двигаться вперед.
Я пытаюсь внедрить evalexpr в OCaml. Довольно легко, используя этот язык, вы бы сказали: так я думал, и первое, что я сделал, используя обычные целые, работало нормально.
Но сейчас я пытаюсь сделать это, используя свой СОБСТВЕННЫЙ тип и свои собственные функции для решения операций: и, конечно, это не так просто, как я ожидал.
type expr =
| Number of MyInt.myint
| Sum of (expr * expr)
| Sub of (expr * expr)
| Product of (expr * expr)
| Divide of (expr * expr)
| Modulo of (expr * expr)
let rec evalexpr expr = function
| Number n -> n
| Sum (a, b) -> MyInt.add (evalexpr a) (evalexpr b)
| Sub (a, b) -> MyInt.sub (evalexpr a) (evalexpr b)
| Product (a, b) -> MyInt.mul (evalexpr a) (evalexpr b)
| Divide (a, b) -> MyInt.div (evalexpr a) (evalexpr b)
| Modulo (a, b) -> MyInt.modulo (evalexpr a) (evalexpr b)
Мне кажется, это нормально ... но компилятор не согласен.
Я думаю, что совершенно очевидно, что «(evalexpr a)» имеет тип MyInt.myint, так как это единственное конечное возвращаемое значение, которое может вернуть функция evalexpr: тем не менее, компилятор думает, что его тип - «expr -> MyInt.myint» .
Значит ли это, что он не применяет функцию evalexpr и возвращает саму функцию ?? если так, то какого черта он это сделает?
Я просто не могу понять это. И я не могу придумать другого способа сделать то, чего я пытаюсь достичь здесь.