haskell - 从 Haskell 中的 IO 数据初始化元组

标签 haskell lambda io tuples

我想知道从 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/

相关文章:

haskell - 在类型列表上映射依赖类型

java - Apache Commons FileUtils 检查文件是否存在于 ftpurl 中

c - printf 中 %% 的作用是什么?

haskell - 使用 GADT 实现类型类

MAC LION 上的 Haskell

haskell 错误: Could not deduce (Random a0) arising from

c# - 异步 lambda 中的参数

python - pandas,lambda 内的比较

python - 舍入 lambda 函数

java - 扫描程序在使用next()或nextFoo()之后跳过nextLine()吗?