F# 中的推断柯里化函数签名
Inferred curried function signatures in F#
在这个article,这个函数
let adderGenerator numberToAdd = (+) numberToAdd
有这个类型的签名
int -> (int -> int)
然而,当我创建这个函数时,推断的类型签名是
int -> int -> int
- 这些类型签名是否不同?
- 如果不是,我如何注释我的
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
在这个article,这个函数
let adderGenerator numberToAdd = (+) numberToAdd
有这个类型的签名
int -> (int -> int)
然而,当我创建这个函数时,推断的类型签名是
int -> int -> int
- 这些类型签名是否不同?
- 如果不是,我如何注释我的
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