[英]why sometimes a function that has parameters inside its definition but in the actual function does not have any?
[英]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.