我最初认为"as"和冒号运算符意味着完全相同的事情,为值或函数指定类型.但我确实发现了一个不一致的地方:
type Uppercase = string -> string
let uppercase:Uppercase = fun n ->
//code
Run Code Online (Sandbox Code Playgroud)
这很好用.但是如果我将冒号改为"as"
type Uppercase = string -> string
let uppercase as Uppercase = fun n ->
//code
Run Code Online (Sandbox Code Playgroud)
它打破了,说它不知道"n"是什么类型.当然,我可以通过这样做来解决这个问题
type Uppercase = string -> string
let uppercase as Uppercase = fun (n:string) ->
//code
Run Code Online (Sandbox Code Playgroud)
它再次开心.所以,我的问题是,为什么"as"与冒号不同,为什么看起来F#在使用"as"时不能进行类型推断?谢谢.
as 用于命名模式匹配的结果,例如
let (a,b) as t = (1,2)
Run Code Online (Sandbox Code Playgroud)
将绑定a到1,b到2和t整个对.因此
let uppercase as Uppercase = fun n -> ...
Run Code Online (Sandbox Code Playgroud)
绑定名称uppercase和Uppercase功能.在此函数中,n未指定类型,因此您会收到类型错误.
as 因此与显式类型声明完全不同,不能互换使用.