[英]Haskell - What makes 'main' unique?
使用此代碼:
main :: FilePath -> FilePath -> IO ()
main wrPath rdPath = do x <- readFile rdPath
writeFile wrPath x
我收到以下錯誤:
Couldn't match expected type 'IO t0'
with actual type 'FilePath -> FilePath -> IO()
但是當我將“main”的名稱更改為其他名稱時,該文件可以正確編譯。
main 有什么獨特之處,為什么它的類型必須是IO t0
?
因為語言規范是這么說的。
Haskell 程序是模塊的集合,按照慣例,其中一個必須稱為
Main
並且必須導出值main
。 該程序的值是模塊Main
中標識符main
的值,對於某些類型t
,它必須是IO t
類型的計算(參見第 7 章)。 當程序被執行時,計算main
被執行,並且它的結果(類型t
)被丟棄。
正如 GolezTrol 所說,所有程序都需要知道在調用 function 時要開始執行哪個符號。 許多腳本語言不需要(或只是不需要) main
例程,因為它們可以將語句放在頂層。 This is not the case for Haskell, C and many others - these languages need a starting location and by convention that is the main
function (as per the Haskell spec - see Cat's answer).
注意 Haskell 的main
不接受與程序 arguments 對應的任何參數 - 這些是通過System.Environment.getArgs
獲得的。
與 C、Java 或 C# 一樣, main
是特定上下文中的特殊標識符,指示程序應從何處開始。
在 Haskell 中, main
被定義為具有類型IO a
。 您應該給您的 function 起一個不同的名稱,或者如果您真的希望它成為起點,請更改其簽名並使用 getArgs 從命令行讀取getArgs
盡管您沒有特別詢問,但main
也很特別,因為它是 Haskell 程序中唯一可以(安全地)調用 IO 動作的 function。 Haskell 運行時將main
視為特殊的。
根據定義, main
是一個 function ,它不接受 arguments 並返回一個類型為IO a
的值,該值被運行時丟棄。 您的錯誤消息是說您的main
不符合這些要求。 這確實是真的,因為您的main
接收兩個參數。
要訪問命令行參數,請使用System.Environment.getArgs
。
Main.main
什么獨特之處?
既然Haskell有一個FFI ,它就很簡單了:
這段代碼: | (有點) | 最終為: |
---|---|---|
模塊 Main(main) 其中 主:: IO () ⋮ |
≈ | 模塊 Main() 其中 main:: IO ()外貿出口主::IO() ⋮ |
(... “比喻上” ,而不是“字面意思” ——把這項工作留作練習;-)
所以Main.main
的獨特之處在於它默認在 Haskell 之外可見,允許運行時系統調用您的 Haskell 程序。 對於任何其他 Haskell 定義,您需要使用 FFI。
為什么它的類型必須是
IO t
?
因為在 Haskell 中,只有IO...
類型的值(通常稱為操作)可以產生可見的效果,例如寫入文件。 此外,運行時系統只有在IO
操作時才能正確調用Main.main
。
我知道這個問題很古老,但我想我應該提一下,你可以在一個不(顯式或隱式)名為Main
的模塊中命名任何你想要的main
。 所以
module Foo where
main :: Int -> Bool
main = (>3)
會編譯得很好。 但是如果你省略了模塊 header,或者使用module Main where...
,那么它就不會了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.