2017-07-02 181 views
3
let prefix prefixString baseString = 
    prefixString + " " + baseString 

prefix "Hello" "World" 

通過上面我遇到了錯誤Stuff.fs(34,1): error FS0039: The value or constructor 'prefix' is not defined.你好世界不會編譯「值或構造沒有定義」

我不完全知道爲什麼發生這種情況,因爲我的代碼我正在F#上觀看video series,其中字面上相同的代碼正在編譯併成功運行。我的環境有問題嗎?

+2

你在哪裏/如何嘗試運行你的代碼?代碼看起來非常有效,並在macOS Sierra上使用'fsharpi'運行。另外,如果文件看起來如何呢?錯誤報告在第34行,所以在這裏丟失了一些東西。 – Jonas

+0

這就是我不明白,該片段是整個文件。我嘗試在VS Code中使用Ionide的「運行選擇」來運行它。 – user9993

+0

好吧,我只是試圖安裝Ionide擴展,每件事似乎都很好。嘗試使用「發送文件」而不是發送選擇,如果這樣做,那麼你可能已經忘記將定義發送給解釋器,但僅僅使用前綴將導致你看到的錯誤。 – Jonas

回答

7

在評論中,您提到您正在使用「運行選擇」命令運行代碼段。該命令在F#Interactive中運行選定的一段代碼,該代碼最初不包含任何定義。所以,如果你選擇並運行剛剛過去的線,你會得到:

> prefix "Hello" "World";; 
stdin(1,1): error FS0039: The value or constructor 'prefix' is not defined 

這是因爲F#互動不知道prefix的定義是什麼 - 它不會在你的文件看它會自動。您可以通過選擇一切,在一個單一的交互運行的所有代碼解決這個問題,或者你可以先運行定義,然後最後一行,即:

> let prefix prefixString baseString = 
    prefixString + " " + baseString;; 
val prefix : prefixString:string -> baseString:string -> string 

> prefix "Hello" "World";; 
val it : string = "Hello World" 

注意當您運行的第一個命令,F#互動將是打印已定義函數的類型,以便您可以查看剛剛定義的內容。

F#Interactive具有自己獨立的「世界狀態」這一事實非常重要,因爲它也意味着您需要在更改函數後重新運行函數,以便後續命令使用新定義。