2010-07-28 51 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 _ ->() 
()