" as"之间的区别和冒号指定类型?

时间:2015-10-14 14:48:13

标签: f#

我原本以为" as"并且冒号运算符意味着完全相同的事情,为值或函数指定类型。但实际上我发现了一个不一致的地方:

type Uppercase = string -> string
let uppercase:Uppercase = fun n ->
    //code

这很好用。但是如果我将结肠更改为"作为"

type Uppercase = string -> string
let uppercase as Uppercase = fun n ->
    //code

它打破了,说它不知道什么类型" n"是。当然,我可以通过

来解决这个问题
type Uppercase = string -> string
let uppercase as Uppercase = fun (n:string) ->
    //code

它又开心了。所以,我的问题是,为什么" as"与冒号不同,为什么F#在使用""时不能进行类型推断?感谢。

1 个答案:

答案 0 :(得分:5)

as用于命名模式匹配的结果,例如

let (a,b) as t = (1,2)

会将a绑定到1,b绑定到2和t到整个绑定。因此

let uppercase as Uppercase = fun n -> ...

将名称uppercaseUppercase绑定到该函数。在此函数中,未指定n的类型,因此您会收到类型错误。

因此,

as与明确的类型声明完全不同,并且不能互换使用。