谁能告诉我这段F#代码有什么问题吗?

谁能告诉我这段F#代码有什么问题吗?,f#,functional-programming,matching,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

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] 
让m=Dictionary()
设rec fib i=
匹配
|1->i
|0->i
| _ -> 
如果m.ContainsKey(i)那么
如果m[i]>0,则
m、 [一]
其他的
设x=fib(i-1)+fib(i-2)
m、 加(i,x)
m、 [一]

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

最后一位稍有错误-应为

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语句中返回。如果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]
让m=Dictionary()
设rec fib i=
匹配
|1->i
|0->i
| _ -> 
如果m.ContainsKey(i)那么
m、 [一]
其他的
设x=fib(i-1)+fib(i-2)
m、 加(i,x)
m、 [一]

要在Stackoverflow上设置格式,只需粘贴代码,然后高亮显示并按ctrl+k或点击
{}
按钮,即可自动将该部分置于代码模式(代码比正常文本缩进四个空格)

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

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

  • 嵌套的
    if
    表达式具有生成不同类型值(即
    int
    unit
    )的分支,并且
  • 外部
    if
    表达式期望内部表达式具有类型
    unit

  • 希望这能有所帮助:)

    好吧,我对F#不是很精通,所以我无法告诉您有什么问题,但是,这种函数式和声明式相结合的代码编写方式不是很好的主意。:-)@Yossarian-这实际上是F#@JohnPalmer中非常常见的模式,真的吗?我很高兴我没有看到这一点,我有点纯粹。:-)@Yossarian,我在故意学习F#,因为我可以将OOP和其他非功能性风格与功能性代码混合。由于这最终是为了解决与工作相关的问题,我对每种语言都能做得很好感兴趣。为了纯洁,我会选择哈斯克尔,我想:)。我不认为一般编程是不好的,我认为它将帮助我构建更好的代码,因为我可以在许多地方消除冗长。现在你已经掌握了这一点,你可能会喜欢:)先生,你的更正是正确的,非常感谢。本周周一早上,我在网上读了一点关于F#对各种任务都有好处的文章后,开始学习F#。我想从VB中休息一下,类型提供程序的事情很有趣。无论如何,我感谢您和eirik的及时帮助和解释。对于像我这样希望在interactive中运行此功能的新手,请修改字典行:let m=System.Collections.Generic.Dictionary()因为您在交互会话中需要完全限定的名称。@Richard-您也可以执行
    打开系统.Collections.Generic
    以达到相同的效果。此外-如果这是正确答案,请点击绿色勾号以标记接受它,以便将来的任何人都能看到它是正确的。我文件开头的open语句在我点击run时有效。当我在Interactive中突出显示并运行时,我发现我需要全名,尽管我想我也可以突出显示OpenStatement。谢谢,确实如此,尽管我已经重新阅读并申请完全获得它。正如你所说,我对这种类型的编码非常陌生。