我对 F# 非常陌生,并且正在玩 F# 上的堆栈计算器以获得乐趣和利润(优秀的网站)。我试图弄清楚如何进行测试项目和课程。我有一个使用这种方法的测试类:
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
所以,如果我调用一个函数并获取一个值(调用推送),它就可以工作。如果我在类 (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
我在Tools|Options -> F# Interactive , F# Interactive options下参考了 FSI 的 SUT 。我使用了-r并在 debug\bin 中引用了程序集。
正如我所提到的,我对这个 F# 的东西非常陌生,我可能会犯一些与我如何组合任何一个模块有关的非常新手错误。
更新 2
根据 John 的评论,我尝试将代码从.exe移动到.dll(库)。它工作得很好。因此,问题与引用.exe相关。所以现在的问题演变成为什么这会有所作为(exe vs dll)?