1

我有以下函数,它接受一个实数并计算它的连分数。但是我尝试使用匹配来实现它,但我不知道它是否可能了,因为我需要进行以下检查 b < 0.0000000001,但我不知道如何在没有 if 语句的情况下仅使用匹配来完成,我需要能够利用 < 运算符

let rec floatfrac (x : float) : int list = 
    let a = int x
    let b = x - (float a)
    match b with
    | b < 0.0000000001 -> [] // error here because wrong syntax
    | _ -> (floatfrac (1.0 / b ))

printfn "%A" (floatfrac 3.14)

错误 FS0010:模式中出现意外的浮点文字。预期的中缀运算符、引号符号或其他标记。

4

1 回答 1

4

您可以使用带有保护的 match 语句 - 您可以在其中为要满足的值提供额外的谓词,这些谓词没有被 case 模式本身捕获:

let rec floatfrac (x : float) : int list = 
    let a = int x
    let b = x - (float a)
    match b with
    | _ when b < 0.0000000001 -> [] 
    | _ -> (floatfrac (1.0 / b ))

但是正如您从这两种情况都使用通配符的事实中看到的那样,当一个简单的 if 可以做到时,首先使用匹配是没有意义的:

if b < 0.0000000001 then 
    [] 
else 
    floatfrac (1.0 / b)
于 2020-10-10T12:36:45.777 回答