簡體   English   中英

為什么Haskell中的主function沒有任何參數?

[英]Why does the main function in Haskell not have any parameters?

我對 Haskell 有點陌生。 我已經完成了一個或兩個教程,但我沒有太多經驗。

Haskell 中的每個 function 都是純粹的,這就是為什么沒有 IO-monad 就不能有任何 I/O。 我不明白的是,為什么程序參數也必須是 IO 動作? 參數像 function 一樣傳遞給程序。 為什么不能像 function 那樣訪問參數?

說清楚,我不明白,為什么主要的 function 必須看起來像這樣

main :: IO()
main = do
    args <- getArgs
    print args

而不是這個

main :: [String] -> IO()
main args = do
    print args

我看不出有任何原因,而且我在谷歌上找不到答案。

這是一種語言設計選擇。 兩種方法都不比另一種更好。

Haskell 可以設計為具有任何一種main電源。

當確實需要程序 arguments 時,將它們作為 function arguments 傳遞給main會更方便。

當不需要程序 arguments 時,將它們傳遞給main有點麻煩,因為我們需要編寫更長的類型,並且需要額外的_來丟棄[String]參數。

此外, getArgs允許人們在程序中的任何位置(在IO內)訪問程序 arguments ,雖然將它們傳遞給main ,但可能不太方便,因為隨后將被迫在程序中傳遞它們,這可能很不方便。

(題外話)對於它的價值,很久以前當我發現在 Java 中我們有void main()而不是int main()時,我和你的反應相似,就像在 C 中一樣。 然后我意識到在大多數程序中我總是寫return 0; 最后,所以總是要求它是沒有意義的。 在 Java 中,這是隱含的默認值,當我們真的需要返回其他內容時,我們使用System.exit() 即使這是在以前的語言(在這種情況下為 C)中完成的方式,新的語言也可以選擇一種新的方式來提供相同的功能。

我傾向於同意 chi 的回答,沒有明顯令人信服的理由必須這樣做,所以它真的歸結為很久以前由一小群人做出的某種主觀判斷。 不能保證背后會有任何特別令人滿意的理由。

這是我想到的一些推理(這可能是原始設計師當時想到的,也可能不是,甚至會同意)。

我們真正喜歡做的是:

main :: Integer -> String -> Set Flag -> IO ()

(對於將 arguments 和 integer、一個字符串和一組標志作為命令行的一些假設程序)

能夠編寫小型命令行程序,就好像它們只是命令行 arguments 的 function 一樣很棒,但這需要操作系統(或至少是 shell)來理解 ZA59B783BA97FCDBB85891DFEDB2E 程序中使用的類型解析它們(以及如果解析失敗,或者如果沒有足夠的 arguments 等,該怎么辦)。 這不會發生。

也許我們可以編寫一個包裝器來做到這一點。 它可以負責將原始字符串命令行 arguments 解析為 Haskell 類型並生成錯誤消息(如果需要),然后為我們調用main 但是等等,我們可以做到這一點! 我們只需要調用包裝器main (並重命名我們之前調用的main )!

關鍵是:如果您想將您的程序視為外部輸入的簡單 function ,那很有意義,但main不是 function main作為一個包裝器工作得更好,它處理通過無類型接口接收輸入並調用“真的是”你的程序的 function 的丑陋細節。

強制您在設置代碼中包含對getArgs的調用,這使得處理命令行 arguments 的工作更加明顯,而不僅僅是訪問它們,並且可能會促使您編寫一些額外的處理代碼,而不僅僅是編寫main (arg1: arg2: _) = do stuffWith arg1 arg2

此外,將我們擁有的界面轉換為您想要的界面非常簡單:

import System.Environment

main = real_main =<< getArgs

real_main :: [String] -> IO ()
real_main args = print args

所以你可以隨心所欲地擁有它!

暫無
暫無

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

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