假设我有一个带有一些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的编译器警告,因为没有静态检查,rh将恰好有4个项目(可以为空,可以有1个项目,可以有1000个项目)。

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

最佳答案

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

关于f# - 绑定(bind)值与列表匹配(没有编译器警告),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30622850/

10-16 09:08