我刚刚意识到 F# 记录是引用类型以及我进行了多少装箱和拆箱。我有很多这样的小记录:
type InputParam =
| RegionString of string
| RegionFloat of float32
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试用“Struct”属性来标记它,我会收到一个编译器错误,指出“FS3204 如果联合类型有多个案例并且是一个结构,那么联合类型中的所有字段都必须被赋予唯一的名称。” 该语言参考显示了创建结构歧视这样的工会:
[<Struct>]
type InputParamStruct =
| RegionString of RegionString: string
| RegionFloat of RegionFloat: float32
Run Code Online (Sandbox Code Playgroud)
x of string 和 x of x: string 有什么区别?这些字段一开始就不是唯一的?为什么 F# 不默认为记录结构?
我正在使用Exercism来学习F#.Nth Prime的挑战是建立一个Eratosthenes筛子.单元测试让你搜索第1,001个素数,即104,743.
我修改了一个代码片段,我记得从F#For Fun和Profit批量工作(需要10k素数,而不是25)并将它与我自己的命令式版本进行比较.性能差异显着:
有没有一种有效的方法来这样做?我喜欢F#.我喜欢使用F#库保存多少时间.但有时我看不到有效的惯用路线.
这是惯用的代码:
// we only need to check numbers ending in 1, 3, 7, 9 for prime
let getCandidates seed =
let nextTen seed ten =
let x = (seed) + (ten * 10)
[x + 1; x + 3; x + 7; x + 9]
let candidates = [for x in 0..9 do yield! nextTen seed x ]
match candidates with
| 1::xs -> xs //skip 1 …Run Code Online (Sandbox Code Playgroud)