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]
如果有人能告诉我如何保持这些帖子的间距,我将不胜感激!
答案 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
时才有效。
记住这些事项,您可以看到此代码段不会通过类型检查,原因有两个:
if
表达式具有生成不同类型值的分支(即int
和unit
)和if
表达式要求内部表达式具有类型unit
。希望这会有所帮助:)