在元组之后但在另一种类型之前的冒号意味着在方法签名中是什么意思?

时间:2016-11-15 17:49:56

标签: f#

在元组之后但在另一种类型之前定位的冒号在方法签名中是什么意思?

这是语法:

member this.Post (portalId : string, req : PushRequestDtr) : IHttpActionResult =

以下是上下文:

type PushController (imp) =
    inherit ApiController ()

    member this.Post (portalId : string, req : PushRequestDtr) : IHttpActionResult =
        match imp req with
        | Success () -> this.Ok () :> _
        | Failure (ValidationFailure msg) -> this.BadRequest msg :> _
        | Failure (IntegrationFailure msg) ->
            this.InternalServerError (InvalidOperationException msg) :> _

具体来说,这种方法签名是什么意思?

此方法是采用两个参数还是一个参数?

我理解这一点:

(portalId : string, req : PushRequestDtr)

但是我对这个附加在其末尾的语法感到困惑:

: IHttpActionResult

1 个答案:

答案 0 :(得分:7)

那将是返回类型,即方法返回的值的类型。

来自F#在线文档:

https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/members/methods

// Instance method definition.
[ attributes ]
member [inline] self-identifier.method-nameparameter-list [ : return-type ]=
    method-body

在这种情况下,return_typeIHttpActionResult,这意味着此方法将返回实现IHttpActionResult接口的对象。

此外,尽管(portalId : string, req : PushRequestDtr)看起来像一个元组(并且在某种程度上它是语法方面的),但事实上它并不被视为元组。在这种情况下,这是声明方法参数的特定F#语法,同时定义了F#对象的方法。这是F#方法模板声明中method-nameparameter-list表示的部分。这意味着Post方法接收两个参数:portalIdreq,而不是单个参数作为元组。

具体来说,在声明方法参数而不是 function 参数时,必须使用这种看起来像元组但不是元组的参数列表的语法。 member关键字是使该行成为方法声明而非函数声明的关键字。

-

关于:>运算符:这是一个强制转换运算符。更具体地说,是一个upcasting运算符(它将更多派生类型的类型更改为类型层次结构中某些更高类型的类型)。

在这种情况下,它用于显式告诉编译器匹配表达式中的每个分支将返回一些派生(或实现)IHttpActionResult的类型。我不太清楚为什么需要这个强制转换(与F#无法在此上下文中推断出正确的类型,请参阅另一个问题:Type mismatch error. F# type inference fail?)但事实上,它正在转换每个可能的返回值到IHttpActionResult这是方法的返回类型。

https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/casting-and-conversions