我正在尝试构建一个通用数值函数来获取一个浮点数组,然后返回一个元组数组,将数组分解为N个相等距离的范围,其中每个元组代表每个范围的下限和上限.结果数组中第一个元组的第一个元素应该是输入数组的最小值,结果数组中最后一个元组的第二个元素应该是输入数组的最大值.
我的问题是我正在尝试使用模式匹配解决这个问题,我的代码编译,但它没有创建任何东西(?)我得到一个警告说第3个模式永远不会匹配.我很困惑,因为我认为我已经涵盖了所有案例 - 第一,最后,然后介于两者之间.在此先感谢有关如何修复此代码的任何好主意.
let rand1000 = [| for i in 1..1000 do yield rnd.NextDouble() |]
let intervals (arr: float array) (n : int) =
let L = Array.min(arr);
let U = Array.max(arr);
let increment = U - L / (float n);
let maxGroup = n-1;
[| for i in 0..maxGroup do
let range = match i with
| 0 -> L, L + increment
| maxGroup -> L + (float n) * increment, U
| _ -> L + (float n) * increment, L + (float (n + 1)) * increment
yield range
|]
let inters = intervals rand1000;
Run Code Online (Sandbox Code Playgroud)
第三种模式永远不会匹配,因为maxGroup匹配任何值.只有字面值可以在匹配块中使用,不是很直观.您正在创建绑定到匹配模式的本地范围变量名称.你想使用when子句,如下所示:
| _ when i = maxGroup -> L + (float n) * increment, U
Run Code Online (Sandbox Code Playgroud)
当i等于maxGroup时,这只匹配任何值.
Chris Smith有一些示例可以更好地演示此功能:http://blogs.msdn.com/chrsmith/archive/2008/10/03/f-zen-the-literal-attribute.aspx