Haskell Can';在do块中重构代码时,IO返回类型不';不匹配

Haskell Can';在do块中重构代码时,IO返回类型不';不匹配,haskell,Haskell,这是原始代码 putBoard :: Board -> IO () putBoard [a,b,c,d,e] = do putRow 1 a putRow 2 b putRow 3 c putRow 4 d putRow 5 e 我想把它改写成 putBoard :: Board -

这是原始代码

putBoard :: Board -> IO ()
putBoard [a,b,c,d,e] = do putRow 1 a
                          putRow 2 b
                          putRow 3 c
                          putRow 4 d
                          putRow 5 e
我想把它改写成

putBoard :: Board -> IO ()
putBoard b = do [putRow r v | (r,v) <- zip [1..] b]
                return ()
putBoard::Board->IO()

putBoard b=do[putRow r v |(r,v)您在这里构造的是一个
IO()
操作列表,但是
IO()
操作列表不是一个将执行所有这些操作的
IO()
对象

您可以使用来执行一元对象列表(实际上是任何可折叠的
)中的操作:

putBoard :: Board -> IO ()
putBoard b = sequence_ (zipWith putRow [1..] b)

这里构造的是一个
IO()
操作列表,但是
IO()
操作列表不是一个执行所有这些操作的
IO()
对象

您可以使用来执行一元对象列表(实际上是任何可折叠的
)中的操作:

putBoard :: Board -> IO ()
putBoard b = sequence_ (zipWith putRow [1..] b)

太好了。我觉得我仍然在思考执行一系列语句并使用return()尝试满足类型签名的地方。为什么“return()”不满足类型签名?@PHemans:因为它期望
do
中的每一行都有type
ioa
(其中
a
可以是任何类型),但列表不是一个
IO
。这很有道理,“do”是语法糖,对吗?谢谢。@PHemans:是的
do{x>=\x->b
,太好了。我觉得我仍然在思考在哪里执行一系列语句,并使用return()来尝试满足类型签名。为什么不使用“return()”呢满足类型签名吗?@PHemans:因为它希望
do
中的每一行都有类型
IO a
(其中
a
可以是任何类型),但是列表不是
IO
。这很有意义,“do”是语法糖,对吗?谢谢。@PHemans:是的
do{x>=\x->b
熟悉你自己。熟悉你自己。
putBoard :: Board -> IO ()
putBoard = sequence_ . zipWith putRow [1..]
import Control.Monad(zipWithM_)

putBoard :: Board -> IO ()
putBoard = zipWithM_ putRow [1..]