2

我目前有一个特殊类型,可以是 int 或 float。我想创建一个函数,允许我将其中两个加在一起。(如有必要,将 int 强制为浮点数)我希望函数具有我的特殊类型的返回类型。

这是我到目前为止所拥有的:

type number = A of int | B of float;;

let plus x1:number x2:number = (number x1) + (number x2);;

不编译。但它看起来与我使用 ML 编程语言所写的相似。

我的plus函数在 F# 中应该是什么样的?

4

2 回答 2

3
type number = A of int | B of float;;

let plus x1:number x2:number = (number x1) + (number x2);;

您在这里遇到的问题是双重的:

  1. 您不能使用具有单个值(在本例中为 A 和 B)的有区别的联合案例,就好像您拥有该值一样。将每种情况视为具有一个值的类(无论如何,这就是它在字节码中的表示方式)。在尝试使用它之前,您需要将值从类中取出。

  2. F# 不允许隐式转换。这意味着一旦您从案例中获取值,您将需要将它们转换为通用类型。在这种情况下,您需要将A值转换为 afloat或将B值转换为 a int

正如@JohnPalmer 在他的回答中指出的那样,解决这两个问题的最明确方法是使用模式匹配。

于 2013-10-25T04:34:37.477 回答
2

所以最好的方法是做类似的事情

let plus x1 x2 = 
    match x1,x2 with
    |A(a),A(a2) -> float(a+a2)
    |A(a),B(b) -> float(a) + b
    |B(b),B(b2) -> b+b2
    |B(b),A(a) -> float(a) + b
于 2013-10-25T04:15:27.777 回答