簡體   English   中英

Haskell - 是什么讓“主要”與眾不同?

[英]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.

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