2014-12-10 2 views
0

Я хочу написать функцию Ocaml, которая принимает два параметра: другую функцию (int-> int) и значение int, а также как-то проверять, использовалось ли ранее с этими параметрами. как это сделать?Ocaml как определить функцию

так что иначе можно понять, как определить функцию с идентификацией, которая может быть переменной?

Проблема: Сделать функцию g, которая принимает функции f и значение int n, чем проверить, было ли g уже использовано для f для этого значения n, если да возвращает ранее полученный результат, иначе count f для n значения. f is int-> int

+2

Могу ли я спросить, почему вам нужно сравнивать функции? – didierc

+0

Я отредактировал сообщение, так что вы можете видеть, зачем мне это нужно. Я не знаю, хорошо ли даже идея сделать это таким образом, но если нет, вы можете дать мне лучше. Я просто программирую адепт. –

+0

* «count f for n value» * Вы имеете в виду параметр 'f' с' n' в качестве параметра? – didierc

ответ

3

Вы можете сравнить функции с оператором ==.

# let f x = x + 2;; 
val f : int -> int = <fun> 
# let g x = x + 5;; 
val g : int -> int = <fun> 
# f == g;; 
- : bool = false 
# f == f;; 
- : bool = true 
# 

Использование команды == очень опасно. Сравнение вещей для физического равенства нецелесообразно, потому что оно пробивает завесу referential transparency. Я лично искал бы другой способ решить любую проблему, над которой вы работаете. (Если вы простите предложение.)

+0

отредактировал сообщение с моей проблемой –

1

Вы должны перевернуть идею вокруг: вместо того, чтобы функции f и g отдельно, имеют g очереди f в версию memoizing сам по себе:

module IntMap = Map.Make (struct type t = int let compare a b = a - b end) 

let g f = 
    let m = ref (IntMap.empty) in 
    fun x -> 
     try IntMap.find x !m 
     with Not_found -> 
      let r = f x in 
      m := IntMap.add x r !m; 
      r 

Очевидно, стоит делать тесты, чтобы узнать, хуже ли стоимость вычислений, чем одна из memoization. Кроме того, было бы лучше использовать Hashtbl вместо Map (слева как упражнение).

+0

Спасибо человеку за ответ. На самом деле идея заключалась в том, чтобы вычислить f n и найти, если f n вызывается в отдельных потоках, и идея заключалась в том, что f вычисляется очень долго, но это то, что я искал. –

+0

О, тогда, возможно, вам нужно убедиться, что сохраненные в памяти данные доступны атомарно. – didierc

+0

'find, если f n вызывается в отдельных потоках. Я думаю, вы должны действительно опубликовать полную проблему. В описании проблемы слишком много путаницы. Если вы говорите «отдельные потоки», тогда возможный код запоминания должен «Mutex» блокировать. –

Смежные вопросы