2015-10-14 62 views
2

我最初认为“as”和冒号操作符意味着完全相同的事情,为一个值或函数指定一个类型。但我实际上发现不一致:“as”和冒号指定类型之间的区别?

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

这工作正常。但是,如果我改变冒号为“as”

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#在使用“as”时无法进行类型推断?谢谢。

+1

关键字'as'与C#中的关键字不同。它与F#中的类型无关。它用于将表达式绑定为单个值,在使用歧视联合时非常有用。 – Gustavo

回答

5

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

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

将结合a为1,b至2和t整个对。因此

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

结合的名称uppercaseUppercase的功能。在这个函数中,没有指定n的类型,所以你得到类型错误。

as因此与显式类型声明有很大不同,不能互换使用。

+0

谢谢!我无法找到关于“as”所做的任何文档。我不知道它是这样做的! – Konata

+2

这是一个关键词,因此在此处列出:https://msdn.microsoft.com/en-us/library/dd233249.aspx – DaveShaw

相关问题