使用Checked模块会对性能产生影响吗?我已经用int类型的序列测试了它,看不出明显的区别.有时检查版本更快,有时未选中更快,但通常不会太多.
Seq.initInfinite (fun x-> x) |> Seq.item 1000000000;;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Real: 00:00:05.272, CPU: 00:00:05.272, GC gen0: 0, gen1: 0, gen2: 0 val it : int = 1000000000
open Checked
Seq.initInfinite (fun x-> x) |> Seq.item 1000000000;;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Real: 00:00:04.785, CPU: 00:00:04.773, GC gen0: 0, gen1: 0, gen2: 0 val it : int = 1000000000
基本上我正在试图弄清楚是否总会打开Checked会有任何不利因素.(我遇到了一个并不是很明显的溢出,所以我现在扮演的是那个不想要另一个伤心的被抛弃的情人的角色.)我能想出的唯一非人为的理由并不总是使用Checked如果有一些性能受到打击,但我还没有见过.
在我正在试验的项目中,我不断地增加序列元素.我想创建一个这样的运算符:
let (.*) (a:seq<'T>) (b:seq<'T>) = Seq.map2 (*) a b
Run Code Online (Sandbox Code Playgroud)
但是,在FSI中它返回:
val ( .* ) : a:seq<int> -> b:seq<int> -> seq<int>
Run Code Online (Sandbox Code Playgroud)
以下失败:
seq [1.0;2.0] .* seq [3.0;4.0];;
-----^^^
stdin(16,6): error FS0001: This expression was expected to have type
int
but here has type
float
Run Code Online (Sandbox Code Playgroud)
如何让操作符在通用seq <'T>上工作(提供'T支持乘法)?
我正在尝试定义一个"准通用"函数.我不希望它完全是通用的,我希望它只适用于"整数"类型(即byte,sbyte,int16,uint16,int,uint32,int64,uint64,bigint).
如何将它放入函数定义的类型注释中?为了澄清,我将如何重写以下代码以实际工作(仅使用3种类型,可能不会失去泛化):
let square (x: int|int64|bigint) =
x * x
Run Code Online (Sandbox Code Playgroud)