F#:不理解匹配..用

时间:2016-08-02 04:14:22

标签: f#

我正在弄乱F#和Fable,并试图测试我的理解。为此,我尝试创建一个函数来计算给定一定次数的迭代次数。我提出的是

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.(如果我交换&则会发生同样的事情#39; n'和'在匹配声明中计算')。我有什么理由不能使用' n'在比赛声明中?有没有办法解决这个问题,所以我可以使用' n'?

由于

1 个答案:

答案 0 :(得分:10)

当您在match语句中使用名称时,您会按照您认为的方式检查分配给该变量的值。而是指定该名称。即,

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

这是否有意义,或者您是否需要我详细介绍?

P.S。在像这样的情况下,你的匹配函数看起来像“x when(布尔条件涉及x) - > case 1 | _ - > case 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