簡體   English   中英

Haskell:解析錯誤:需要模塊頭、導入聲明或頂級聲明

[英]Haskell: Parse error: module header, import declaration or top-level declaration expected

在通過 Haskell 教科書工作時,我將一些命令保存在 .hs 文件中的 Haskell 腳本中。 這是一個小例子。

fst (1,2)
snd (1,2)

當我從 GHCi 的前奏中運行這些命令時,它們工作正常。 當我嘗試用這兩行編譯 .hs 文件時,我得到以下信息:

ch4_test.hs:2:1: error:
    Parse error: module header, import declaration
    or top-level declaration expected.
  |
2 | fst (1,2)
  | ^^^^^^^^^
Failed, no modules loaded.

我在谷歌上搜索了這個錯誤,但找不到任何解釋我做錯了什么。

從新手到未來的新手:互動環境ghci會讓你相信你可以將一些表達式打入.hs文件並運行該東西(以類似於swift和ruby之類的語言)。 不是這種情況。

Haskell需要一個名為main的入口點。 引用:

這是一個簡單的程序來讀取然后打印一個字符:

 main :: IO () main = do c <- getChar putChar c 

名稱main的使用很重要:main被定義為Haskell程序的入口點(類似於C中的main函數),並且必須具有IO類型,通常是IO()

資料來源: https//www.haskell.org/tutorial/io.html

你不能只在hs文件中放置任何表達式。

正如錯誤消息所示,您需要在此處聲明。 例如:

main =
    print (fst (1,2)) >>
    print (snd (1,2))

我收到此錯誤,但原因似乎與此處發布的任何內容完全不同。 並且錯誤消息根本沒有幫助。

在 MacOS High Sierra (10.13) 上使用 Cabal 版本 3.6.2.0 和 GHCI 8.10.7 我從這個頁面工作: https ://www.tutorialspoint.com/haskell/haskell_modules.htm 特別是“自定義模塊”部分。 在那里你可以看到我復制和粘貼的代碼。

除了教程沒有提到我需要向 myfirstapp.cabal 添加“other-modules: Custom”,此外示例 Custom.hs 文件包含“if x 'rem' 2 == 0”而不是“if x rem 2 == 0",這里是問題:

縮進很重要!

這一行(在引號內)不起作用“if x rem 2 == 0”。 這一行確實有效“如果 x rem 2 == 0”!

縮進一個空格是成功與失敗的區別。

我對 Haskell 完全陌生。 我用 PHP、Javascript 和 Applescript 進行了廣泛的編程,並涉足了其他十幾種,這是我第一次看到空格問題。 我認為這在 Haskell 老手中是眾所周知的,但如果它在文檔中顯眼地包含它肯定會很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM