2016-07-10 44 views
4

F#中的type Something()type Something有什么区别?F#:有括号和不带括号的类型之间的区别

为什么这个片段在ASP.NET Core 1.0 F# project作品引用:

open System 
open Microsoft.AspNetCore.Hosting 
open Microsoft.AspNetCore.Builder 
open Microsoft.AspNetCore.Hosting 
open Microsoft.AspNetCore.Http 

type Startup() = 
    member this.Configure(app: IApplicationBuilder) = 
     app.Run(fun context -> context.Response.WriteAsync("Hello from ASP.NET Core!")) 

[<EntryPoint>] 
let main argv = 
    let host = WebHostBuilder().UseKestrel().UseStartup<Startup>().Build() 
    host.Run() 
    printfn "Server finished!" 
    0 

但这种失败:

open System 
open Microsoft.AspNetCore.Hosting 
open Microsoft.AspNetCore.Builder 
open Microsoft.AspNetCore.Hosting 
open Microsoft.AspNetCore.Http 

type Startup = 
    member this.Configure(app: IApplicationBuilder) = 
     app.Run(fun context -> context.Response.WriteAsync("Hello from ASP.NET Core!")) 

[<EntryPoint>] 
let main argv = 
    let host = WebHostBuilder().UseKestrel().UseStartup<Startup>().Build() 
    host.Run() 
    printfn "Server finished!" 
    0 
+0

不同的类型都是通过F#中的'type'关键字定义的,包括类型别名,DU,记录,类等等。不同的参数将指出你正在创建什么类型的类型。 [介绍F#类型:](http://fsharpforfunandprofit.com/series/understanding-fsharp-types.html) – s952163

回答

7

您可以通过在F#互动键入它看到了差距:

type Parens() = 
    member this.add10 x = x + 10 

type NoParens = 
    member this.add10 x = x + 10;; 

输出:

type Parens = 
    class 
    new : unit -> Parens 
    member add10 : x:int -> int 
    end 
type NoParens = 
    class 
    member add10 : x:int -> int 
    end 

第二个类没有定义构造函数。编译器不应该允许的东西,但出于某种原因。它不会生成像C#这样的自动构造函数。

欲了解更多信息,请查阅F#以获取更多乐趣和获利关于classesinterfaces的网页。另外看看这个StackOverflow post

并且为了将来的参考,当有疑问的时候,打开F#interactive,输入你想查看的两个东西之间的区别,并比较输出结果。这是一个强大的工具,你应该使用它。

相关问题