Насколько я понимаю, у вас есть два массива. Один определяет область функции, другой диапазон. И вы хотите написать функцию ocaml, которая представляет эту функцию. Здесь я предполагаю, что функция биективна. Недостающая часть, meat, - это функция для поиска индекса элемента в массиве. В духе List.find
я решил передать функцию для определения этого сравнения.
let find_index p array =
let rec find_index idx =
if idx = (Array.length array) then raise Not_found
else if (p array.(idx)) then idx
else find_index (idx+1)
in
find_index 0
Отсюда создание функции тривиально, и наоборот,
let f domain range x = range.(find_index (fun y -> 0 = compare x y) domain)
let f' domain range y = domain.(find_index (fun x -> 0 = compare x y) range)
Есть лучший способ, если вы планируете использовать это не только для небольшого набора данных. Действительно, это плохая реализация для Map
- у этого есть O (n) поиск, в то время как у карты будет O (log (N)). Я понимаю, что вас могут не интересовать альтернативы, поэтому я оставлю свои рекомендации на этом.