F#:带类型定义的报价?

时间:2010-07-28 16:05:42

标签: f# quotations

我正在玩引号,我看不到类型定义的表达模式。真的没有,或者我错过了什么?

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

在引文文字中提供“意外的关键字'类型'。”

1 个答案:

答案 0 :(得分:10)

你做不到。您只能引用代码,也就是说任何valid F# expression。类型定义不被视为代码,而是定义。

您可能想要做的是将ReflectedDefinition属性放在类型成员上:

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

如果要检索ReflectedDefinition成员的AST,可以使用Expr.TryGetReflectedDefinition函数。

例如,此示例代码打印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 _ -> ()
()