F#:警告FS0020:这个表达式应该有'unit'类型,但是类型'bool'

Pax*_*xxi 3 f# unit-type

我试图通过解决一些欧拉问题来学习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循环,特别是在存在纯功能(和更简单)的解决方案时,如在这种情况下.我建议你阅读一下功能风格的编程.当然,只是掌握语法本身就是一件有用的事情.