F#具有匹配模式错误的递归函数



我有下面的函数,它取一个实数并计算它的连续分数。然而,我已经尝试过使用match,但我不知道这是否可能,因为我需要进行以下检查b < 0.0000000001,但我也不知道如果没有if语句,如何使用match来完成,我需要能够使用<操作员

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:模式中出现意外的浮点文字。应为中缀运算符、引号或其他标记

您可以使用一个带有保护的match语句,在这里您可以为一个值提供额外的谓词来实现用例模式本身没有捕获的谓词:

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)

最新更新