使用强制F#创建自定义类型的“加号”功能

时间:2013-10-25 04:12:00

标签: f# coercion

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

这是我到目前为止所做的:

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

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

不编译。但是,如果我使用ML编程语言,它看起来与我要写的相似。

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

2 个答案:

答案 0 :(得分: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值转换为float或将B值转换为int

  3. @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