2016-09-25 81 views
0

我是這個函數式編程語言f#的新手,雖然這個小代碼可能存在幾個問題,但我只是好奇它爲什麼不運行。值或構造函數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 

它給了我錯誤代碼FS0039:值或構造函數n沒有定義。我不明白爲什麼。當我調用函數sum並將其賦值結果時,我傳遞了參數4(即n)。

你能告訴我你看到了什麼嗎?

謝謝。

我想使函數的遞歸:

let rec recSum (n:int):int = 
if n > 0 then 
    recSum n * (n+1)/2 
    printf "%A " n 
else 
    n 
recSum 4 

,但我不能讓它返回一個int。它不斷返回一個單位。

+0

不好格式化? :-) – s952163

回答

1

簡單來說你的函數如下:

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)指定的類型該函數的參數,第二個特定於函數的輸出。所以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# SyntaxVisual F#上的各種文檔。

退還部,陰影S中的函數內部:

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 
+0

是的,這是正確的。我發現它實際上沒有while循環。有趣。但是如果我確實需要讓我的代碼運行(包括while循環),我將如何去解決我遇到的錯誤?當我添加'*'運算符時,我修正了「n沒有定義的問題」,但沒有定義「 – kthonenice

+0

」您很少使用while循環,儘管可能實際上確實需要使用for/while循環和mutable出於性能原因的變量。這種結合是非常必要的,你最好避免一開始。我故意沒有編輯你的Q,但讓我粘貼一個工作版本到模擬你的問題的答案。 – s952163

+0

@kthonenice你去了。 – s952163

1

你應該有n *(n + 1) - 操作數之間缺少'*'。

1

在這種情況下

s <- n(n+1)/2 

將被視爲調用ñ像函數因此錯誤消息。你應該寫

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

改爲。

+0

哦,是啊!修正了「n沒有定義的問題」,但它現在給我的「沒有定義」,而不是? s設爲1,那麼這裏有什麼問題? – kthonenice

+0

好吧,我做了全局變量,現在我得到錯誤消息:FS0001:這個表達式應該有int - > int類型,但是這裏的類型是int。 我在想這個。你能詳細解釋一下嗎? 我理解我的功能是這樣的: sum採用int類型的參數n,然後返回int = s。不過,我認爲我有錯誤的想法。 (因此錯誤) – kthonenice

相關問題