1

我正在学习Jason Hickey 的 Objective Caml 简介只是对嵌套函数(currying)有疑问。

有一个现有的问题如何理解 Haskell 中的“Currying”?,但我想我正在寻找略有不同的问题的答案。


它说我们可以let sum = fun i j -> i + j;;写成let sum = fun i -> fun j -> i + j;;

我的问题很简单:

我可以这样理解上面的定义let sum = fun i -> i + fun j -> j;;吗?

我知道它不会通过编译器,但我只是尝试将这种映射OCaml function definitionmathematics functions.

在我上面的想象中,我们可以很容易地在数学中编写函数,f(i) = i + g(j); and g(j) = j.

我应该总是做这种逻辑映射以便于理解吗?

4

2 回答 2

3

你的想象并不正确:f(i) = i + g(j)并不像j这里未定义的那样有意义。

一个正确的理解方法fun i j -> foo是把它看作是更明确的符号的一些方便的语法糖fun i -> fun j -> foo

以下所有定义完全相同:

let sum i j = i + j
let sum i = fun j -> i + j
let sum = fun i -> (fun j -> i + j)
let sum = fun i -> fun j -> i + j
let sum = fun i j -> i + j

let sum i =
  let add_i = fun j -> i + j in
  add_i

这在数学上可以写成 (i ↦ (j ↦ i+j)),作为函数空间的一个元素 (ℕ → (ℕ → ℕ))。

于 2012-12-03T12:39:50.443 回答
1

OCaml 函数可以直接映射到数学符号或从数学符号映射。但是,您需要意识到数学符号是模棱两可的。f(i)函数的值 ,特定值i和函数f本身之间没有明显的区别。f(i)当一个人表示函数f本身时,通常会写。(“让我们考虑一个函数 f(i)=i+1... 这个函数是...”)要在 OCaml 中编写正确的代码,您必须清楚地看到您是在使用函数本身还是使用值的一个功能。

当你用数学符号说,“考虑函数f(i,j)=i+g(j) where g(j)=j,你正在写函数的值。在 OCaml 中,这被翻译成

  let f i j = 
       let g j = j in 
       i + g j;;

或者

  let f = 
     let g = fun j -> j 
     in
     fun i j -> i + g j;;

如果您正在尝试编写let sum = fun i -> i + fun j -> j;;,那么在数学符号中您是在说“考虑sum这样的函数sum(i) = i + g,其中 g 是由 定义的函数g(j)=j。” 这在数学上是不正确的:您不能将整数值 i函数 g相加。您只能在某个其他整数上添加一个整数i和函数的。严格来说,表达式“ ”是未定义的。要么你想写,要么,但不是。在数学中如此,在 OCaml 中也是如此。gji+gi + g(i)i+g(j)i+g

于 2012-12-04T09:00:05.657 回答