2010-07-28 52 views
9

我玩着引號,我看不到類型定義的表達模式。是真的沒有一個,還是我錯過了什麼?F#:帶類型定義的報價?

<@@ type MyType (name:string) = 
    member x.Name = name @@> 

在引用文字中給出「Unexpected keyword'type'」。

回答

10

你不行。您只能引用代碼,也就是說,任何valid F# expression。類型定義不被視爲代碼,而是定義。

你可能想要做的是把ReflectedDefinition屬性上一個類型的成員:

type MyType (name : string) = 
    [<ReflectedDefinition>] member x.Name = name 

如果你想檢索具有ReflectedDefinition成員的AST可以使用Expr.TryGetReflectedDefinition功能。

E.g,此示例代碼打印MyType所有反射定義成員的AST:

open Microsoft.FSharp.Quotations 
open System.Reflection 

type MyType (name : string) = 
    [<ReflectedDefinition>] member x.Name = name 

let mis = typeof<MyType>.GetMembers() 
for mi in mis do 
    try 
     match Expr.TryGetReflectedDefinition(mi :?> MethodBase) with 
     | Some(e) -> printfn "%A" e 
     | None ->() 
    with _ ->() 
()