F# 不理解匹配。。具有

F# 不理解匹配。。具有,f#,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)

我在玩弄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。(如果在match语句中交换'n'和'count',也会发生同样的情况)。有什么原因我不能在匹配语句中使用“n”吗?有没有办法让我用“n”


谢谢

当您在
匹配
语句中使用名称时,并不是按照您认为的方式将其与分配给该变量的值进行核对。而是指定该名称。即

match someInt with
| n -> printfn "%d" n
将打印
someInt
的值。它等价于
让n=someInt;printfn“%d”n

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

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
这有意义吗,还是需要我更详细地解释

另外,在这种情况下,匹配函数看起来像“x when(涉及x的布尔条件)->case1 | uux->case2”,使用一个简单的
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

这是一个很好的解释,所以请投票:)然而,我认为一个更简单、更惯用的解决方案是使用
if/then/else
表达式。是的,
if/then/else
在这种情况下更好。我希望尽可能接近OP的原始代码来说明差异,但我也可以编辑答案以显示更好的方式。我认为可以像您那样显示模式匹配语法,因此我会将其保留在答案中,但也可以添加
if/then/else
选项。这非常有用。我的原始代码使用了if/then语句,但我想要看起来“漂亮”的东西,或者Haskellish(这是我的第一种函数语言)。