具有列表匹配的绑定值(没有编译器警告)

Binding values with list matching (without compiler warning)

假设我有一个函数接受一些 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 个项目,可能有 1000 个) .

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

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

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

您可以专门为 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

我将把它留作 reader 的练习以实施 map2map3 等。;)