我知道标题绝对令人困惑,但是也许此描述会清楚
我正在编写一个将相同功能应用于自身结果的函数
let add1 x = x + 1
let twice f x = (f (f x))
现在,我想使用add2
和add1
来写twice
,所以我这样做
let add2 = twice add1
let%test "Testing add2..." =
Int.(=) 1337 (add2 1335)
和测试通过,但是后来我想,因为我们要通过add2
传递int值,所以也许add2
的函数签名中应该存在另一个参数,然后将其传递给add1
所以我写了这个
let add2 x = twice add1 x
这也通过了测试,这是正确的测试方法,为什么会发生这种情况?
答案 0 :(得分:0)
它们都是正确的,而且含义相同。 编写示例的第三种方法是:
let add2 = fun x -> twice add1 x
ocaml是一种函数式编程语言,因此,它允许您将另一个函数的结果返回给一个函数。 让我们考虑
let add x y = x + y
add
的类型为int -> int -> int
,实际上是int -> (int -> int)
,它是一个以整数作为参数并返回整数的函数。
因此,您可以这样编写add1
:
let add1 = add 1
我们将add
类型的int -> (int -> int)
应用于1 : int
,因此add 1
的类型为int -> int
并对应于采用x
并返回{ {1}}。
当您将1 + x
应用于两个参数add
和x
(即y
)时,您实际上是在写
add x y
。
最后,您可以操纵函数,而函数(add x) y
是将f
与f x
或换句话说x
关联的函数。
(我希望这不要太令人困惑。)