Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 创造;加上;使用强制F的自定义类型的函数#_F#_Coercion - Fatal编程技术网

F# 创造;加上;使用强制F的自定义类型的函数#

F# 创造;加上;使用强制F的自定义类型的函数#,f#,coercion,F#,Coercion,我目前有一个特殊类型,可以是int或float。我想创建一个函数,允许我将其中的两个添加到一起。(必要时强制int为float)我希望函数有一个特殊类型的返回类型 以下是我到目前为止的情况: type number = A of int | B of float;; let plus x1:number x2:number = (number x1) + (number x2);; 不编译。但它看起来与我使用ML编程语言时编写的内容类似 我的plus函数在F#中应该是什么样子的?所以最好的方

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

以下是我到目前为止的情况:

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

let plus x1:number x2:number = (number x1) + (number x2);;
不编译。但它看起来与我使用ML编程语言时编写的内容类似


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

所以最好的方法是

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
这里的问题有两个:

  • 您不能使用具有单个值(在本例中为a和B)的区分并集案例,就好像您具有该值一样。将每种情况视为一个类,其中包含一个值(无论如何,字节码中都是这样表示的)。在尝试使用该类之前,需要从该类中取出该值

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


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

    它给了我一个错误“模式鉴别器'plus'没有定义”我应该更改什么?@jth41-有一些打字错误是固定的
    type number = A of int | B of float;;
    
    let plus x1:number x2:number = (number x1) + (number x2);;