Я пишу небольшой скрипт с некоторыми утилитами комбинаторики. Когда мне нужен числовой литерал, такой как 0
или 1
в другом типе, я использую _0
и _1
, но это решение является менее идеальным. Можно ли использовать Camlp4 для реинтерпретации числовых литералов в заданном контексте или добавления нового типа числового литерала с выделенным суффиксом?OCaml перегружает числовой литерал с помощью Camlp4
open Num
let zero = num_of_int 0
let one = num_of_int 1
let _0 = zero
let _1 = one
(* some useful infix operators *)
let (+) = (+/)
let (-) = (-/)
let (*) = (*/)
let (<) = (</)
let (>) = (>/)
let (=) = (=/)
let (/) numer denom =
if mod_num numer denom = _0
then div_num numer denom
else invalid_arg "division is not a total function"
(* factorial, naive *)
let rec fact n =
if n < _0
then invalid_arg "negative factorial"
else if n = _0
then _1
else
n * fact (n - _1)
(* naive algorithm *)
let choose n k = (fact n/fact k)/fact (n - k)
С открытым номером вы можете написать 'let i = Int 4', который не очень громоздкий. И трюк с определяющими числами нуль, один и два можно увидеть довольно часто в коде. –