3

例如,拿 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 中运行这个程序并给出一个论点。

4

2 回答 2

6

的类型main是其最终表达式的类型;print产生IO (),所以这就是 的类型main。中间类型不相关,因为(>>=)除了 monad 不传播任何东西。

(>>=) :: Monad m => m a -> (a -> m b) -> m b

a不会出现在结果类型 ( m b) 中。

至于在 GHCi 中运行你的程序,看一下:main命令。

于 2011-06-18T15:20:03.420 回答
4

你想要:setargs 的值。例如:

Prelude> import System.Environment
Prelude System.Environment> getArgs
[]
Prelude System.Environment> :set args ["foo","bar"]
Prelude System.Envrionment> getArgs
["foo","bar"]

至于类型签名问题,这里 main 的类型是由print v. 在它之前的所有其他内容都被操作员忽略>>

于 2011-06-18T15:30:17.890 回答