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

问题描述

| 例如,以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
确定。
>>
运算符将忽略之前的所有其他内容。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...