Я немного запутался в том, когда использовать или реализовывать функторы в своем коде. Я включил некоторый код ниже, который имеет две функции display_expr, cal_expr, и обе эти функции имеют одну и ту же форму, но отличаются в реализации. Будет ли это место, где я хотел бы рассмотреть создание одного функтора, который будет представлять собой основную функциональность обеих функций?OCaml - Когда использовать Функторы
type expr =
| Add of expr * expr
| Minus of expr * expr
| Multi of expr * expr
| Divide of expr * expr
| Value of int;;
let rec display_expr e =
match e with
| Add (a1, a2) -> "("^display_expr a1^" + "^display_expr a2^")"
| Minus (m1, m2) -> "("^display_expr m1^" - "^display_expr m2^")"
| Multi (m1, m2) -> "("^display_expr m1^" * "^display_expr m2^")"
| Divide (d1, d2) -> "("^display_expr d1^"/"^display_expr d2^")"
| Value v -> string_of_int v;;
let rec cal_expr e =
match e with
| Add (a1, a2) -> (cal_expr a1) + (cal_expr a2)
| Minus (m1, m2) -> (cal_expr m1) - (cal_expr m2)
| Multi (m1, m2) -> (cal_expr m1) * (cal_expr m2)
| Divide (d1, d2) -> (cal_expr d1)/(cal_expr d2)
| Value v -> v;;
let equ =
Multi(Value 34,
Add(Value 24,
Divide(Value 24,
Minus(Value 10, Value 7)
)
)
);;
Printf.fprintf stdout "%d = %s\n" (cal_expr equ) (display_expr equ);;
Примечание: Я пытался писать функтор решение для приведенного выше кода, и я получил один рабочий, как только я понял, что функтор требуется общий или комбинированный тип для значений, возвращаемых display_expr и cal_expr.
Также: Я крайний новобранец OCaml, поэтому, пожалуйста, подумайте об этом в своем ответе. Спасибо.
Как выглядели ваши решения functor? Мне трудно представить его, учитывая, что функторы являются по существу функциями модулей от модулей, а код, который вы указали, не содержит в нем модулей. –