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

Kon*_*ata 2 f#

我最初认为"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"时不能进行类型推断?谢谢.

Lee*_*Lee 5

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)

绑定名称uppercaseUppercase功能.在此函数中,n未指定类型,因此您会收到类型错误.

as 因此与显式类型声明完全不同,不能互换使用.

  • 它是一个关键字,因此它列在这里:https://msdn.microsoft.com/en-us/library/dd233249.aspx (2认同)