【问题标题】:Ocaml how to identify functionOcaml如何识别函数
【发布时间】:2014-12-10 20:29:21
【问题描述】:

我想编写 Ocaml 函数,它接受两个参数:其他函数 (int->int) 和 int 值,然后以某种方式检查它是否早先与这些参数一起使用。怎么办?

那么看待这个问题的另一种方式是如何识别具有可变标识的函数?

问题是:创建函数 g,它接受函数 f 和 int 值 n,然后检查 g 是否已用于 f 的值 n,如果是则返回先前得到的结果,否则将 f 计数为 n 值。 f 是 int->int

【问题讨论】:

  • 请问为什么需要比较函数?
  • 我已经编辑了帖子,所以你可以看到,我为什么需要它。我不知道这样做是不是更好,但如果不是,你可以给我一个更好的。我只是编程高手。
  • "count f for n value"你的意思是用n作为参数调用f吗?
  • 您似乎正在尝试为签名int -> int 的任何函数f 构建记忆技术。我说的对吗?
  • 以上 cmets 中的两个答案都是肯定的

标签: ocaml


【解决方案1】:

您可以使用== 运算符比较函数。

# 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 的面纱。我个人会寻找另一种方法来解决您正在处理的任何问题。 (如果你能原谅这个建议。)

【讨论】:

    【解决方案2】:

    你需要换个思路:不要将函数 fg 分开保留,而是让 gf 转换为自身的记忆版本:

    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
    

    显然值得做基准测试,看看计算成本是否比记忆成本更差。此外,最好使用Hashtbl 而不是Map(留作练习)。

    【讨论】:

    • 感谢您的回答。实际上的想法是计算 f n 并查找是否在单独的线程中调用了 f n 并且想法是 f 计算真的很长,但这就是我想要的。
    • 哦,那么也许您需要确保以原子方式访问记忆数据。
    • find if f n was called in separate threads 我想你必须真正发布完整的问题。在你的问题描述中,太混乱了。如果你说separate threads,那么可能的记忆密码需要Mutex锁定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多