我对F#非常陌生,并在F# for fun and profit(优秀网站)上玩堆栈计算器。我试图弄清楚如何有一个测试项目和课程。我有一个使用此方法的测试类:
open NUnit.Framework
open FSharpDoodles.MainProgram
[<TestFixture>]
type ProgramTests()=
[<Test>]
member self.FirstTest()=
// Create some stacks
let EMPTY = StackContents []
let try1 = push 1.0 EMPTY // OK
let try2_partial = push 1.0 // OK
let try2 = try2_partial EMPTY // OK - does same as ONE below
let stackWith1 = ONE EMPTY // FAILS: ONE is null
()
它正在测试的代码是:
module FSharpDoodles.MainProgram
type Stack = StackContents of float list
let push x (StackContents contents) =
StackContents ( x::contents )
let ONE = push 1.0
所以,如果我调用一个函数并获取一个值(调用push),它就可以了。如果我在类中创建一个部分应用的函数(try2_partial),那就可以了。但是,当我引用一个返回部分应用函数的ONE时,ONE为空。
为什么?
故事的其余部分
我使用NCrunch作为我的测试跑步者。它完全有可能导致问题。
修改
正如约翰所建议的那样,我在FSI中尝试了这个并得到同样的问题。以下是相同测试代码的渐进式应用:
open FSharpDoodles.MainProgram
let EMPTY = StackContents [];;
val EMPTY : FSharpDoodles.MainProgram.Stack = StackContents []
> let try1 = push 1.0 EMPTY;;
val try1 : Stack = StackContents [1.0]
> let try2_partial = push 1.0;;
val try2_partial : (Stack -> Stack)
> let try2 = try2_partial EMPTY;;
val try2 : Stack = StackContents [1.0]
> let stackWith1 = ONE EMPTY;;
System.NullReferenceException: Object reference not set to an instance of an object.
at <StartupCode$FSI_0006>.$FSI_0006.main@()
Stopped due to error
我在工具|选项 - &gt;下提到了FSI的SUT。 F#Interactive , F#交互式选项。我使用 -r 并在debug \ bin中引用了程序集。
正如我所提到的,我对这个F#的东西很陌生,而且我可能会犯一些与我如何组合其中任何一个模块有关的新手错误。
更新2
根据John的评论,我尝试将代码从 .exe 移动到 .dll (库)。它工作正常。因此,该问题与引用 .exe 有关。所以问题现在演变成为什么这会产生影响(exe vs dll)?