10

引用符で遊んでいますが、型定義の式パターンがわかりません。本当に1つもありませんか、それとも何か不足していますか?

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

「引用リテラルに予期しないキーワード 'type' があります。」

4

1 に答える 1

11

できません。コード、つまり有効な F# 式のみを引用できます。型定義はコードではなく、定義と見なされます。

あなたがしたいことはReflectedDefinition、型メンバーに属性を置くことです:

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

関数ReflectedDefinitionを使用できるメンバーの AST を取得する場合。Expr.TryGetReflectedDefinition

たとえば、このサンプル コードは、反映されたすべての定義メンバーの AST を出力しますMyType

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 _ -> ()
()
于 2010-07-28T16:25:54.360 に答える