我想知道从 Haskell 中的输入读取的数据中获取元组的最佳方法是什么。当输入由包含空格分隔的整数的几行组成时,我经常在竞争性编程中遇到这个问题。 Here is an example :
1 3 10
2 5 8
10 11 0
0 0 0
要读取整数行,我使用以下函数:
readInts :: IO [Int]
readInts = fmap (map read . words) getLine
然后,我将这些列表转换为具有适当大小的元组:
readInts :: IO (Int, Int, Int, Int)
readInts = fmap ((\l -> (l !! 0, l !! 1, l !! 2, l !! 3)) . map read . words) getLine
这种方法对我来说似乎不是很地道。
以下语法更具可读性但它只适用于 2 元组:
readInts :: IO (Int, Int)
readInts = fmap ((\[x, y] -> (x, y)) . map read . words) getLine
(编辑:如评论中所述,上述解决方案通常适用于 n 元组)。
有没有一种惯用的方法来初始化整数列表中的元组,而不必在 Haskell 中使用 !!
?或者,是否有不同的方法来处理这种类型的输入?
最佳答案
这个怎么样:
readInts :: IO (<any tuple you like>)
readInts = read . ("(" ++) . (++ ")") . intercalate "," . words <$> getLine
关于haskell - 从 Haskell 中的 IO 数据初始化元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57693986/