我原本以为" 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#在使用""时不能进行类型推断?感谢。
答案 0 :(得分:5)
as
用于命名模式匹配的结果,例如
let (a,b) as t = (1,2)
会将a
绑定到1,b
绑定到2和t
到整个绑定。因此
let uppercase as Uppercase = fun n -> ...
将名称uppercase
和Uppercase
绑定到该函数。在此函数中,未指定n
的类型,因此您会收到类型错误。
as
与明确的类型声明完全不同,并且不能互换使用。