Haskell:为什么GHC推断主方法的类型不完全?

Bab*_*san 3 haskell type-inference ghci

例如,使用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
Run Code Online (Sandbox Code Playgroud)

将其加载到GHCi中.

:t getArgs ---> getArgs :: IO [String]
:t main    ---> main :: IO ()
Run Code Online (Sandbox Code Playgroud)

为什么main的类型签名没有反映出getArgs :: IO [String]被调用的事实?

运行二进制文件时,您可以给出一个参数. <prog> 145返回Just 100 但是在GHCi中,你不能:main 145给出错误.你如何在GHCi中运行这个程序并给出一个参数.

gee*_*aur 6

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

(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

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

至于在GHCi中运行程序,请查看:main命令.

  • 如果这困扰你,那么只需将所有代码放在`mainX :: [String] - > IO()`函数中,并使'main = getArgs >> = mainX` (2认同)