Haskell “return”语句的类型与函数的类型有何不同;什么是定义?

Haskell “return”语句的类型与函数的类型有何不同;什么是定义?,haskell,types,type-inference,io-monad,do-notation,Haskell,Types,Type Inference,Io Monad,Do Notation,在一个循环中,整数被收集在一个列表中,这些整数的元组是returned。这是如何变成元组列表的 input :: IO [(Int,Int)] input = do n <- readLn :: IO Int forM [1..n] $ \_ -> do [x,y] <- map read . words <$> getLine return (x,y) input::IO[(Int,Int)] 输入=do n do [x,y]让我们用显式

在一个循环中,整数被收集在一个列表中,这些整数的元组是
return
ed。这是如何变成元组列表的

input :: IO [(Int,Int)]
input = do
  n <- readLn :: IO Int
  forM [1..n] $ \_ -> do
    [x,y] <- map read . words <$> getLine
    return (x,y)
input::IO[(Int,Int)]
输入=do
n do

[x,y]让我们用显式分隔符重新编写代码,使代码结构更加明显:

input :: IO [(Int,Int)]
input = do {
    n <- readLn ;
    forM [1..n] (\ _ -> do {
        [x,y] <- fmap (map read . words) getLine ;
        return (x,y)  })
    }
因此,总体类型是
IO[b]~IO[(t1,t2)]
,因为
b~(t1,t2)
根据
返回
表达式

lambda函数返回
IO b
so
forM
根据上述类型返回
IO[b]
。并且
do
块的类型与其上一个表达式的类型相同


函数的签名说它是
IO[(Int,Int)]
,所以最后
t1~Int
t2~Int
一切都合适。

你的问题到底是什么?我真的不清楚你在问什么没有“返回声明”<代码>返回
是一个函数(和一个虚拟构造函数)。
forM :: [a] -> (a -> IO b) -> IO [b]