haskell - 如何在 Haskell 中从 stdin 读取三个连续整数?

标签 haskell io-monad

我想读取像 12 34 56 这样的输入使用 Haskell 将其分解为三个整数。

对于单个整数,可以使用 myInteger <- readLn 。但对于这种情况,我没有找到任何解决方案,除了首先读取一行,然后用 , 替换所有空格。 ,(使用类似:

spaceToCommas str =
  let repl ' ' = ','
      repl  c =   c
  in map repl str

),然后调用read '[' ++ str ++ ']'这感觉很hackish。另外,它不允许我声明我想要读取三个 个整数,它将尝试从标准输入读取任意 数量的整数。

必须有更好的方法。

请注意,我想要一个依赖外部包的解决方案。使用例如Parsec 当然很棒,但是这个简单的示例不需要使用成熟的解析器组合器框架,对吗?

最佳答案

如何将字符串转换为:

convert :: Read a => String -> [a]
convert = map read . words

words 将给定的字符串拆分为字符串列表(“单词”),然后我们使用 map 对每个元素执行 read >.

例如使用它:

main = do
    line <- getLine
    let [a,b,c] = convert line :: [Int] in putStrLn (show (c,a,b))

或者,例如,如果您想阅读前三个元素而不关心其余部分(是的,这显然需要 super 创造力技能):

main = do
    line <- getLine
    let (a:b:c:_) = convert line :: [Int] in putStrLn (show (c,a,b))

我在这里返回了一个元组,该元组向右旋转一个位置以显示解析已完成。

关于haskell - 如何在 Haskell 中从 stdin 读取三个连续整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42253027/

相关文章:

haskell - Haskell 中的 print 是纯函数吗?

haskell - 如何从 Haskell 中任意类型 [a] 的标准输入中读取列表?

haskell - 迭代列表,直到结果列表为空列表

haskell - 带有剩余物的导管水槽

performance - evalRandIO 的奇怪性能

haskell - 如何在 Parsec 中手动操作特殊表达式的优先级?

haskell - 什么(如果有的话)是最小化 IO Monad 对我的代码的影响的普遍接受的方法

haskell - 的 是什么意思? Haskell 中的记录语法如何做?

haskell - 减少围绕手工包装的 `Num` 类型的样板

haskell - 这种类型的签名发生了什么? (Haskell 中的 Vector.Mutable 修饰符)