3

else 语句之前的行显然期待一个单位,但得到了一个布尔值。我刚开始使用 F#,但无法理解这一点。

由于我以前从未使用过 Stackoverflow,所以我正在与布局作斗争,而且代码框仍然让我感到困惑!我相信,原件中的间距是正确的。

let m = Dictionary<int, int>() 

let rec fib i = 
    match i with
    | 1 -> i
    | 0 -> i
    | _ -> 
        if m.ContainsKey(i) then  
           if m.[i] > 0 then 
              m.[i] 
            else
              let x = fib(i - 1) + fib(i - 2)
              m.Add(i, x)
        m.[i] 

如果有人能告诉我如何在这些帖子中保持间距,我将不胜感激!

4

2 回答 2

5

最后一点有点错误 - 应该是

if m.ContainsKey(i) then  
       if m.[i] > 0 then 
          m.[i] 
        else
          let x = fib(i - 1) + fib(i - 2)
          m.Add(i, x)
          x

您正在从 if 语句中返回。你可能也不需要if m.[i] > 0。在这种情况下,您会得到

let m = Dictionary<int, int>() 

let rec fib i = 
    match i with
    | 1 -> i
    | 0 -> i
    | _ -> 
        if m.ContainsKey(i) then  
            m.[i] 
        else
            let x = fib(i - 1) + fib(i - 2)
            m.Add(i, x)
            m.[i]

要在 Stackoverflow 上进行格式化,只需将代码粘贴进去,然后突出显示,然后按 ctrl+k 或点击{}按钮以自动将该部分置于代码模式(代码在普通文本之后缩进四个空格)

于 2012-11-30T09:45:56.310 回答
3

如果您不熟悉此类语言,则很容易犯错误。请记住,F# 是基于表达式的,因此if- then-else子句是计算结果的表达式。为了实现这一点,类型检查器要求 if 表达式的所有分支都具有相同的类型,就像模式匹配一​​样。此外,if缺少关闭分支的表达式else仅在其分支类型为 时才有效unit

牢记这些事情,您可以看到此代码段不会通过类型检查,原因有两个:

  1. 嵌套if表达式具有产生不同类型值的分支(即intand unit)和
  2. 外部if表达式期望内部表达式具有 type unit

希望这可以帮助 :)

于 2012-11-30T11:28:43.807 回答