[英]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()
你不能只在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.