未定义值或构造函数n

时间:2016-09-25 22:13:58

标签: .net function f# functional-programming

我是这个函数式编程语言f#的新手,虽然这个小代码可能有几个问题,但我很好奇为什么它不会运行。

sub2

它给出了错误代码FS0039:未定义值或构造函数n。我不明白为什么。当我调用函数sum并将其赋值给结果时,我传递参数4(即n)。

你能告诉我你的看法吗?

谢谢。

我想让函数递归:

let sum n : int -> int = s
let mutable s = 1
while s <= n do
 s <- n(n+1)/2
 printf "%A " s
let result = sum 4

但是我不能让它返回一个int。它不断返回一个单位。

3 个答案:

答案 0 :(得分:1)

你应该有n *(n + 1) - 缺少&#39; *&#39;在操作数之间。

答案 1 :(得分:1)

在这种情况下

s <- n(n+1)/2 

将被视为像函数一样调用n,因此错误消息。你应该写

s <- n*(n+1)/2

代替。

答案 2 :(得分:0)

简单来说,您的功能如下:

let sum n =
    let s = n * (n+1)/2
    printf "%A " s

let result = sum 4

如果你想要注释它并且明确关于类型,那么更简单的术语:

let sum' (n:int):int =
    n * (n+1)/2

sum' 4

(n:int)指定函数参数的类型,第二个:int指定函数的输出。因此sum'是一个函数,它接受int并返回一个int。所以现在你可以这样做:

[1..4] |> List.map sum'

命名可能更好,例如numOfCorrel或类似的东西。 现在你有可能在追求其他东西,在这种情况下,请指定你的算法或至少输入的预期输出。

原始问题的工作版本:

let sum2 (n:int):int = 
    let mutable s = 1
    while s <= n do
        s <- n * (n+1)/2
    s

let result = sum2 4

在这种情况下,sum2需要int并返回int。如果您确实将printfn放入函数中,那么将打印结果并返回()单位。你在第一行中的原始函数没有多大意义:它等同于:我是一个函数,它接受int并返回一个int,我等于s。显然,由于上面没有定义s值,F#编译器会抱怨。如需快速入门,请阅读F# Syntax上的Visual F#和各种文档。

返回单位,在函数内部遮蔽:

let s = 4
let sum3 (n:int): unit = 
    let mutable s = 1
    while s <= n do
        s <- n * (n+1)/2
    printfn "%A" ("s = " + (string s))
sum3 4
s