F# 中的推断柯里化函数签名

Inferred curried function signatures in F#

在这个article,这个函数

let adderGenerator numberToAdd = (+) numberToAdd

有这个类型的签名

int -> (int -> int)

然而,当我创建这个函数时,推断的类型签名是

int -> int -> int
  1. 这些类型签名是否不同?
  2. 如果不是,我如何注释我的 adderGenerator 以便它具有第一个类型签名?

编辑 1
这是迄今为止我能想到的最好的:

type Generator = int -> (int -> int)
let adderGenerator: Generator = (+)

我不喜欢它如何让 adderGenerator 采用无点风格。

编辑 2
这似乎有效:

let adderGenerator numberToAdd : (int -> int) = (+) numberToAdd

类型签名相同,括号只是帮助表明函数体导致函数被 returned。

这三种带完整类型注释的形式是等价的:

let adderGenerator : int -> int -> int =
    (+)

let adderGenerator (numberToAdd : int) : int -> int =
    (+) numberToAdd

let adderGenerator : int -> int -> int =
    fun numberToAdd -> (+) numberToAdd

第一种形式只是 + 的别名,只是重申其类型。

第二种形式是函数声明,分别注释参数的类型和return类型。

第三种形式是变量赋值匿名函数。

然而,只明确说明一个论点对我来说似乎有点奇怪。您可以通过明确两个参数来完全避免部分应用:

let adderGenerator (a : int) (b : int) : int =
    (+) a b

let adderGenerator : int -> int -> int =
    fun a b -> (+) a b