【问题标题】:How do you take unspecified arithmetic claim (or another function) as parameter?您如何将未指定的算术声明(或其他函数)作为参数?
【发布时间】:2014-09-21 10:15:31
【问题描述】:

例如,

(*) f 是算术声明:+、-、*、/。 x 是整数列表。 y 是整数。

rawr 将 f 应用于 x 和 y 的每个元素并返回累加值 *)

让 rawr f x y= .... …… ....

rawr ( * ) [1;2;3] 2 应该返回 (1*2) + (2*2) + (3*2) = 12

rawr (+) [1;2;3] 2 应该返回 (1+2) + (2+2) + (3+2) = 12

我不需要编写更原始的代码(这只是我想出的一个随机示例以明确我的问题),但我确实需要将其他函数或算术声明作为参数(尤其是对于 rec 或折​​叠结构)。我一直在尝试不同的格式,但到目前为止没有成功...谁能告诉我如何将未指定的算术声明或函数作为参数?

谢谢!

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    目前尚不清楚您是要采用符号公式还是 OCaml 函数,或者您是否需要能够接受其中任何一个。

    假设您只对函数参数感到满意。

    函数作为函数的参数是像 OCaml 这样的 FP 语言毫不费力地做的事情。

    一个典型的例子是函数List.fold_left。这是List.fold_left 的一个实现,它可能会向您展示这种东西的样子:

    let rec fold_left f accu l =
      match l with
        [] -> accu
      | a::l -> fold_left f (f accu a) l
    

    如果你像函数一样使用参数,OCaml 会发现它是一个函数。这就是类型推断的工作原理。

    你可以使用这个函数来添加一个数字列表:

    $ ocaml
            OCaml version 4.01.0
    
    # let rec fold_left f accu l =
      match l with
        [] -> accu
      | a::l -> fold_left f (f accu a) l
            ;;
    val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
    # fold_left (+) 0 [4;5;7];;
    - : int = 16
    #
    

    事实上,如果您想接受一个函数或某种符号表达式,您需要弄清楚如何表示和评估您的符号表达式。这在 OCaml 中不是免费提供的,您必须定义它。

    【讨论】:

    • 谢谢。这帮助很大。
    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多