添加两个浮点数元组

Bli*_*lib 1 f# tuples function

我需要创建一个函数,将两个由浮点数组成的元组相加,并返回一个由两个浮点数组成的元组。

let add a b =
  fst a + fst b, snd a + snd b
Run Code Online (Sandbox Code Playgroud)

给我这个回报:

val add : int * int -> int * int -> int * int
Run Code Online (Sandbox Code Playgroud)

但如果我尝试:

let add (a:float) (b:float) =
  fst a + fst b, snd a + snd b
Run Code Online (Sandbox Code Playgroud)

我明白了:

This expression was expected to have type
    ''a * 'd'    
but here has type
    'float'    
Run Code Online (Sandbox Code Playgroud)

我该如何获得以下回报?

val add : float * float -> float * float -> float * float
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 7

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

let add (a : float * float) (b : float * float) = ...
Run Code Online (Sandbox Code Playgroud)

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

let add (a1:float, a2:float) (b1:float, b2:float) =
    (a1 + b1), (a2 + b2)
Run Code Online (Sandbox Code Playgroud)

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

let add (a1:float, a2:float) (b1, b2) =
    (a1 + b1), (a2 + b2)
Run Code Online (Sandbox Code Playgroud)

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

let inline add a b = ...
Run Code Online (Sandbox Code Playgroud)

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

编译为 IL 的非inline函数无法做到这一点,因为 IL 不允许指定“有一个+运算符”之类的约束。但编译器必须使用某种类型,因此它默认为int.


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

let add a b = ...

let x = add (1.0, 2.0) (3.0, 4.0)
Run Code Online (Sandbox Code Playgroud)

最后一行将让编译器知道您期望参数为float.