这是我用来解释我的问题的最小代码示例.以下代码组织在两个文件中并编译正常:
DataStruct.fs
module MyMod
type XXX = {
a: int
}
with
static member GetNew =
{
a = -1
}
type YYY = {
a: float
}
with
static member GetNew =
{
a = -1.0
}
type Choice =
| XXX of XXX
| YYY of YYY
Run Code Online (Sandbox Code Playgroud)
Program.fs
open MyMod
let generator =
let res = XXX.GetNew
Choice.XXX res
let myVal : XXX =
match generator with
| XXX x -> x
| _ -> printfn "expected XXX, …Run Code Online (Sandbox Code Playgroud) 前提:我认为管道操作员只不过是语法糖,因此x |> f应该完全相同f(x).
类似地,我认为这f (fun x -> foo)相当于let g = fun x -> foo; f g
但显然我不明白存在差异.
例1:
static member contents =
let files = Directory.EnumerateFiles (__SOURCE_DIRECTORY__+ @"\foo\bar.txt")
let fileList = List.ofSeq files
fileList |> List.map (fun f -> TestCaseData(f).SetName(""))
Run Code Online (Sandbox Code Playgroud)
这工作得很好:TestCaseData预计的arg:obj其匹配由f该消息又在推断为是string因为fileList是文件名的列表.但是以下不起作用
static member contents =
let files = Directory.EnumerateFiles (__SOURCE_DIRECTORY__+ @"\foo\bar.txt")
let fileList = List.ofSeq files
List.map (fun f -> TestCaseData(f).SetName("")) fileList
Run Code Online (Sandbox Code Playgroud)
除了最后一行之外什么都没有改变.突然f被推断为 …
目前我有以下结构:
let rec foo x = State.state{
let rec bar =
//...
foo 5
//...
//...
bar
//...
}
Run Code Online (Sandbox Code Playgroud)
我想提取'bar'函数并获得如下结构:
let rec foo x = State.state{
//...
bar
//...
}
and bar = State.state{
//...
foo 5
//...
}
Run Code Online (Sandbox Code Playgroud)
这将允许我有另一个函数foo2,它也可以使用bar并避免代码重复.
问题是:我的提案没有在F#中编译,显然这是因为State上下文.那么达到所需代码结构的语法正确方法是什么?
我正在尝试使用NUnit为F#项目设置测试套件。似乎特别是在测试诸如解析器和类型检查器之类的东西时,通常具有一列有效输入数据和一列无效数据。测试本身实际上是相同的,因此我正在寻找一种聪明的方法来避免为每个数据项编写测试函数,而是将测试函数与数据分开。显然,这似乎有一个所谓的测试用例,但是我很难找到有关将NUnit 3与F#一起使用的全面文档,尤其是针对我的场景的最佳实践示例。
非常感谢任何指针和提示!