F#:不了解与..的匹配

罗杰

我在搞弄F#和寓言,并试图检验我的理解。为此,我尝试创建一个函数以给定一定的迭代次数来计算e。我想出的是

let eCalc n =
      let rec internalECalc ifact sum count =
          match count = n with
          | true -> sum
          | _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)

      internalECalc 1.0 0.0 1

可以正常工作,当调用时返回2.7182818284590455

eCalc 20

但是,如果我尝试使用的话,我认为是更正确的形式

let eCalc n =
      let rec internalECalc ifact sum count =
          match count with
          | n -> sum
          | _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)

      internalECalc 1.0 0.0 1

我收到警告“ [警告]此规则将永远不会匹配(L5,10-L5,11)”,并且返回值为0。(如果我在匹配项中交换“ n”和“ count”,也会发生相同的情况陈述)。我不能在match语句中使用'n'吗?有没有办法解决这个问题,所以我可以使用'n'吗?

谢谢

match语句中使用名称时不会按照您认为的方式将其与分配给该变量的值进行比较。您正在分配该名称。IE,

match someInt with
| n -> printfn "%d" n

将打印的值someInt等于let n = someInt; printfn "%d" n

您想要做的是使用一个when子句;when子句中,您不是在进行模式匹配,而是在检查时执行“标准”操作。所以您想要的是:

let eCalc n =
      let rec internalECalc ifact sum count =
          match count with
          | cnt when cnt = n -> sum
          | _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)

      internalECalc 1.0 0.0 1

这有意义吗,还是您需要我进一步详细介绍?

PS在这种情况下,您的匹配函数看起来像“ x when(涉及x的布尔条件)->情况1 | _->情况2”,使用一个简单的if表达式可读性更高

let eCalc n =
      let rec internalECalc ifact sum count =
          if count = n then
              sum
          else
              internalECalc (ifact / (float count)) (sum + ifact) (count+1)

      internalECalc 1.0 0.0 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章