例如,拿Don Stewart回答Stack Overflow问题的代码来说:
import Control.Monad
import qualified Data.HashTable as H
import System.Environment
main = do
[size] <- fmap (fmap read) getArgs
m <- H.new (==) H.hashInt
forM_ [1..size] $ \n -> H.insert m n n
v <- H.lookup m 100
print v
在 GHCi 中加载它。
:t getArgs ---> getArgs :: IO [String]
:t main ---> main :: IO ()
为什么 main 函数的类型签名不反映调用了 getArgs :: IO [String]
函数?
当你运行二进制文件时,可以传递一个参数。
<prog> 145
返回 Just 100
。
但在 GHCi 中无法这样做:main 145
报错。如何在 GHCi 中运行此程序并传递参数。
IO
之外,这样做会有什么价值。这是对编译器有帮助的信息,但除此之外并没有其他用处。除非你真正考虑的是拆分IO
,这是一个长期讨论的话题,最终结果是这将是一场后勤噩梦。 - geekosaurmainX :: [String] -> IO ()
函数中,并使用main = getArgs >>= mainX
。 - Thomas M. DuBuisson