2

我对 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)?

4

1 回答 1

0

它不起作用的原因是我引用的是 EXE 而不是 DLL。DLL 中的相同代码可以正常工作。感谢John Palmer的问题让我调查了这个角度,然后提供了解释(见评论)。

于 2014-08-14T01:07:43.433 回答