gpt4 book ai didi

haskell - 为什么 `do` block 中的类型在下一行匹配,但在同一行不匹配?

转载 作者:行者123 更新时间:2023-12-04 22:02:46 24 4
gpt4 key购买 nike

我从用户必须输入的输入中读取了几行:

main :: IO ()
main = do
let size = 3
arr <- replicateM size getLine
let pairs = map parsePair arr
print pairs

为什么我可以在单独的行上执行 map parsePair arr但不在同一行,像这样:
arr <- map parsePair (replicateM size getLine)

这样做,我得到了错误:
• Couldn't match type ‘[]’ with ‘IO’
Expected type: IO [Int]
Actual type: [[Int]]

为了给您更多细节,这是 parsePair:
parsePair string = map parseInt $ words string

parseInt :: String -> Int
parseInt s = read s :: Int

最佳答案

因为replicateM size getLine的类型是IO [String],所以它不是String的列表,所以它基本上是对将获得IO[String]操作的描述。您可以在 <- monad 中看到箭头 IO 作为检索它并解压缩结果的一种方式。

但是,您可以对此进行一些处理,因为IO也是Functor,因此可以使用fmap :: Functor f => (a -> b) -> f a -> f b:

main :: IO [Int]
main = do
let size = 3
fmap (map parsePair) (replicateM size getLine)

或者您可以将 fmap 转移到 getLine 部分:
main :: IO [Int]
main = do
let size = 3
replicateM size (fmap parsePair getLine)

请注意,有一个 readLn :: Read a => IO a 函数,它基本上是 fmap read getLine(除了它进行一些额外的错误处理)。因此,我们可以使用:
main :: IO [Int]
main = do
let size = 3
replicateM size readLn

关于haskell - 为什么 `do` block 中的类型在下一行匹配,但在同一行不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57494084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com