问题描述
|
例如,以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中运行该程序并给出参数。
解决方法
main
的类型为其最终表达形式; print
产生IO ()
,因此是main
的类型。中间类型无关紧要,因为ѭ10不会传播单子以外的任何东西。
(>>=) :: Monad m => m a -> (a -> m b) -> m b
结果类型(m b
)中不会出现a
。
至于在GHCi中运行程序,请查看:main
命令。
, 您想将args的值减15。例如:
Prelude> import System.Environment
Prelude System.Environment> getArgs
[]
Prelude System.Environment> :set args [\"foo\",\"bar\"]
Prelude System.Envrionment> getArgs
[\"foo\",\"bar\"]
至于类型签名问题,这里的main的类型由print v
确定。 >>
运算符将忽略之前的所有其他内容。