我试图通过解决一些欧拉问题来学习F#,我发现了一个我无法弄清楚的问题.这是我天真的解决方案.
let compute =
let mutable f = false
let mutable nr = 0
while f = false do
nr <- nr + 20
f = checkMod nr
nr
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到错误消息警告FS0020:该表达式应该具有类型'unit',但在表达式"nr < - nr +20"上具有类型'bool'.我已经尝试重写和移动表达式,我总是在while语句下面的行上得到错误.
我是用VS2010 Beta写的.
Bri*_*ian 13
由于我可以想象这个weg页面成为查找有关警告FS0020的信息的"规范"位置,这里是我收到警告的三个最常见情况的快速摘要,以及如何解决它们.
故意丢弃仅为其副作用调用的函数的结果:
// you are calling a function for its side-effects, intend to ignore result
let Example1Orig() =
let sb = new System.Text.StringBuilder()
sb.Append("hi") // warning FS0020
sb.Append(" there") // warning FS0020
sb.ToString()
let Example1Fixed() =
let sb = new System.Text.StringBuilder()
sb.Append("hi") |> ignore
sb.Append(" there") |> ignore
sb.ToString()
Run Code Online (Sandbox Code Playgroud)
警告很有用,指出错误(函数没有效果):
// the warning is telling you useful info
// (e.g. function does not have an effect, rather returns a value)
let Example2Orig() =
let l = [1;2;3]
List.map (fun x -> x * 2) l // warning FS0020
printfn "doubled list is %A" l
let Example2Fixed() =
let l = [1;2;3]
let result = List.map (fun x -> x * 2) l
printfn "doubled list is %A" result
Run Code Online (Sandbox Code Playgroud)
混淆赋值运算符和相等比较运算符:
// '=' versus '<-'
let Example3Orig() =
let mutable x = 3
x = x + 1 // warning FS0020
printfn "%d" x
let Example3Fixed() =
let mutable x = 3
x <- x + 1
printfn "%d" x
Run Code Online (Sandbox Code Playgroud)
Nol*_*rin 10
以下行:
f = checkMod nr
Run Code Online (Sandbox Code Playgroud)
是一个平等检查,而不是我认为你打算的任务.将其更改为:
f <- checkMod nr
Run Code Online (Sandbox Code Playgroud)
一切都应该工作正常.我不确定为什么你在前一行使用了正确的语法而不是那行...
此外,该线while f = false do应该真正简化为while not f do; 对布尔值的平等检查相当复杂.
我个人注意到,我觉得有必要指出你有效地尝试使用F#作为命令式语言.在功能语言(包括F#)中强烈建议不要使用可变变量和while循环,特别是在存在纯功能(和更简单)的解决方案时,如在这种情况下.我建议你阅读一下功能风格的编程.当然,只是掌握语法本身就是一件有用的事情.