使用列表匹配绑定值(无编译器警告)

时间:2015-06-03 14:22:25

标签: f#

我们说我的函数需要一些int个参数,但在其中我会使用float32

我不想在任何地方使用float32 i功能。

相反,我想这样做:

let x = float32 x
let y = float32 y
let w = float32 w
let h = float32 h

为了收紧一点,我可以这样做:

let x, y, w, h = float32 x, float32 y, float32 w, float32 h

我想这样做:

let [x;y;w;h] = List.map float32 [x;y;w;h]

这样可行,但是我得到Incomplete pattern matching on this expression的编译器警告,因为没有静态检查rhs将有4个项目(可能是空的,可能有1个项目,可能有一千个)。 / p>

我不想禁用编译器警告 这只是一个坏主意吗?在这种情况下,我应该忽略编译器警告,还是有一些很好的,惯用的方法呢?

2 个答案:

答案 0 :(得分:3)

您可以专门为4元组定义一个地图函数:

let map4 f (x, y, w, h) = (f x, f y, f w, f h)

它的类型为f:('a -> 'b) -> x:'a * y:'a * w:'a * h:'a -> 'b * 'b * 'b * 'b。请注意,假定元组中的所有元素都具有相同的类型。

样本用法(FSI):

> let x, y, w, h = map4 float32 (1, 2, 3, 4);;

val y : float32 = 2.0f
val x : float32 = 1.0f
val w : float32 = 3.0f
val h : float32 = 4.0f

我会将其作为练习留给读者实施map2map3等;)

答案 1 :(得分:0)

不完整的模式警告是因为有一种情况你忘记了:空列表[]的情况。

你是否有义务使用x,y,z ......? 这是工作:let l = List.map float32 [x;y;w;h]没有警告。