谁能告诉我这个F#片段有什么问题?

时间:2012-11-30 09:04:53

标签: f# functional-programming matching

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] 

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

2 个答案:

答案 0 :(得分: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或按{}按钮自动将该部分置于代码模式(代码缩进到正常文本之后的四个空格)

答案 1 :(得分:3)

如果你是这种语言的新手,很容易犯错。请记住,F#是基于表达式的,因此if - then - else子句是一个计算结果的表达式。为了实现这一点,类型检查器要求if表达式的所有分支与模式匹配具有相同的类型。此外,缺少结束if分支的else表达式仅在其分支的类型为unit时才有效。

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

  1. 嵌套的if表达式具有生成不同类型值的分支(即intunit)和
  2. 外部if表达式要求内部表达式具有类型unit
  3. 希望这会有所帮助:)