获得我应该获得整数的单位

Cle*_*ker 2 f#

我一直在尝试编写一个递归函数,它将一定数量的数字作为输入,并输出所有数字的总和,它们是3和5的倍数,从1到输入数字(3 + 5 + 9..n).

这是我的代码

let rec add_nums n = 
    if n < 1 then 0
    if (n%5 > 0) then 0
    else n + add_nums(n-1)
Run Code Online (Sandbox Code Playgroud)

scr*_*wtp 7

if是F#中的表达而不是语句.由于它们是表达式,因此两个thenelse分支都需要具有相同的返回类型.这意味着在实践中,你不能有一个if没有else分支,除非 then分支返回单位(允许else被省略分支).编译器看到它else被省略了,并推断出then分支的类型应该是unit.

这解决了它:

let rec add_nums n = 
    if n < 1 
        then 0
        else if (n%5 > 0) 
                 then 0
                 else n + add_nums(n-1)
Run Code Online (Sandbox Code Playgroud)

如果你按照if这种方式格式化,它将使这些问题变得更容易.

并且可以说你也可以把你的谓词放在一个单独的if.


Hel*_*olm 6

我可以大胆地建议使用比赛吗?

let rec add_nums n = 
    match n with
    | x when x < 1 -> 0
    | x when x % 5 > 0 -> 0
    | _ -> n + add_nums(n-1)
Run Code Online (Sandbox Code Playgroud)

添加更多条件然后有点"更容易"和(可以)更具可读性......

使用匹配也"更好",因为它(可能)使得更容易看到返回值中的错误.