我是这个函数式编程语言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。它不断返回一个单位。
答案 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