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
soforM
根据上述类型返回IO[b]
。并且do
块的类型与其上一个表达式的类型相同
函数的签名说它是IO[(Int,Int)]
,所以最后t1~Int
和t2~Int
一切都合适。你的问题到底是什么?我真的不清楚你在问什么没有“返回声明”<代码>返回
是一个函数(和一个虚拟构造函数)。
forM :: [a] -> (a -> IO b) -> IO [b]