Reflection F#引用自定义类型的类型提供程序

Reflection F#引用自定义类型的类型提供程序,reflection,f#,type-providers,discriminated-union,Reflection,F#,Type Providers,Discriminated Union,我正在构造一个简单的类型提供程序,但在引用我创建的类型时似乎遇到了问题。例如,给定 namespace Adder type Summation = Summation of int module QuickAdd = let add x y = x + y |> Summation 我希望通过以下测试用例: module Adder.Tests open Adder open NUnit.Framework type Simple = QuickAddProvider&l

我正在构造一个简单的类型提供程序,但在引用我创建的类型时似乎遇到了问题。例如,给定

namespace Adder

type Summation = Summation of int

module QuickAdd = 
  let add x y = x + y |> Summation
我希望通过以下测试用例:

module Adder.Tests

open Adder
open NUnit.Framework

type Simple = QuickAddProvider<1, 2>

[<Test>]
let ``Simple sample is 3`` () =
  let foo = Simple()
  Assert.AreEqual(foo.Sample, Summation 3)
生成的文件中存在以下错误:

The type "Summation" is not defined
The namespace or module "Adder" is not defined

当用
int
替换
Summation
类型时,测试用例编译并通过,因此我知道我的类型提供程序并没有严重错误。我是否需要在某个地方以某种方式“导入”求和类型?

此错误通常意味着您正在创建包含自定义类型值的报价单。类型提供程序中的引号只能包含基元类型的值—编译器知道如何序列化这些基元类型—但不能处理自定义类型

在代码段中,以下情况发生:

let result = QuickAdd.add num1 num2
let orig = ProvidedProperty("Sample", typeof<Summation>, GetterCode = (fun args -> 
  <@@ result @@>))
另一个选项是在报价单中重新创建
总和
值:

let (Summation n) = result
<@@ Summation n @@>
let(求和n)=结果

这是可行的,因为它只需要序列化一个原语
int
值,然后生成对
Summation
case构造函数的调用。

太棒了,谢谢你的提示,我不知道引用的限制。除了类型提供程序初学者包之外,你知道关于这个F#主题的好资源吗?专家F#v3在类型提供者和引用方面似乎有点欠缺。
let result = QuickAdd.add num1 num2
let orig = ProvidedProperty("Sample", typeof<Summation>, GetterCode = (fun args -> 
  <@@ result @@>))
<@@ QuickAdd.add num1 num2 @@>
let (Summation n) = result
<@@ Summation n @@>