添加两个浮点数元组

Adding two tuples of floats

我需要创建一个函数,添加两个由浮点数组成的元组,returns 是两个浮点数的元组。

let add a b =
  fst a + fst b, snd a + snd b

给我这个 return:

val add : int * int -> int * int -> int * int

但如果我尝试使用:

let add (a:float) (b:float) =
  fst a + fst b, snd a + snd b

我明白了:

This expression was expected to have type
    ''a * 'd'    
but here has type
    'float'    

我如何才能获得以下 return?

val add : float * float -> float * float -> float * float

如果您希望 ab 都属于 float * float 类型,您可以直接指定:

let add (a : float * float) (b : float * float) = ...

或者您可以直接在参数声明中解构元组:

let add (a1:float, a2:float) (b1:float, b2:float) =
    (a1 + b1), (a2 + b2)

顺便说一下,您只需指定其中一个元组的类型,另一个元组的类型将根据它的元素添加到第一个元组的元素这一事实来推断:

let add (a1:float, a2:float) (b1, b2) =
    (a1 + b1), (a2 + b2)

或者,您可以标记函数 inline:

let inline add a b = ...

这意味着该函数不会被编译到 IL 中,而是会在每个使用站点进行扩展。反过来,这将使它能够与任何具有 + 运算符的类型一起工作。

inline 函数被编译成 IL,不能这样做,因为 IL 不允许指定像“有一个 + 运算符”这样的约束。但是编译器要使用some类型,所以默认为int.


或者,您可以通过给它一些其他来源来推断类型来防止编译器默认为 int。比如同一个文件中的一个使用站点:

let add a b = ...

let x = add (1.0, 2.0) (3.0, 4.0)

最后一行会让编译器知道您希望参数为 float

如果你知道元组总是包含浮点数,我认为最干净的方法是这样的:

let add (ax : float, ay : float) (bx : float, by : float) =
    (ax + bx), (ay + by)