我目前有一个特殊类型,可以是int或float。我想创建一个允许我将其中两个一起添加的函数。 (如果需要,将int强制转换为浮点数)我希望函数具有我的特殊类型的返回类型。
这是我到目前为止所做的:
type number = A of int | B of float;;
let plus x1:number x2:number = (number x1) + (number x2);;
不编译。但是,如果我使用ML编程语言,它看起来与我要写的相似。
我的plus
函数在F#中应该是什么样的?
答案 0 :(得分:3)
type number = A of int | B of float;;
let plus x1:number x2:number = (number x1) + (number x2);;
你遇到的问题有两个:
您不能使用具有单个值的歧视联合案例(在本例中为A和B),就好像您具有该值一样。将每个案例视为一个具有一个值的类(无论如何它都是在字节码中表示的)。在尝试使用它之前,您需要从类中取出值。
F#不允许隐式转换。这意味着一旦从案例中获取了值,就需要将它们转换为通用类型。在这种情况下,您需要将A
值转换为float
或将B
值转换为int
。
@JohnPalmer在回答中指出,解决这两个问题最明确的方法是使用模式匹配。
答案 1 :(得分: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