Haskell - 尝试将函数应用于多个数字的行

时间:2015-03-30 23:09:21

标签: string parsing haskell

我是Haskell的新手,我正在尝试将一个函数(gcd)应用于标准输入,这是行分隔的,每行包含不少于或多于两个数字。以下是我输入的示例:

3
10 4
1 100
288 240

我目前正在将每一行分成两个数字的元组,但我无法弄清楚如何分离这些元组并将函数应用于它们。以下是我到目前为止的情况:

import Data.List

main :: IO ()
main = do
  n <- readLn :: IO Int
  content <- getContents
  let  
    points = map (\[x, y] -> (x, y)). map (map (read::String->Int)). map words. lines $ content
    ans = gcd (fst points :: Int) (snd points :: Int)
  print ans

任何信息作为两个开始寻找这个答案的好地方将非常感激。我已阅读Learning Haskell教程,但未找到有关此特定问题的任何信息。

2 个答案:

答案 0 :(得分:3)

你非常接近。在调用gcd之前,没有理由转换为元组或元组列表。

main = do 
  contents <- getContents 
  print $ map ((\[x,y] -> gcd (read x) (read y)) . words) . lines $ contents 

所有有趣的内容都在printcontents之间。 lines会将内容拆分为多行。 map (...)将函数应用于每一行。 words将该行拆分为单词。 \[x,y] -> gcd (read x) (read y)将匹配两个字符串的列表(否则会抛出错误 - 一般不是好的做法,但对于这样的简单程序来说很好),将这些字符串读作Integer并计算它们的GCD。

如果您想使用惰性IO,为了在输入每一行后打印每个结果,您可以按如下方式更改它。

main = do 
  contents <- getContents 
  mapM_ (print . (\[x,y] -> gcd (read x) (read y)) . words) . lines $ contents 

答案 1 :(得分:0)

或者,您可以采用更为迫切的风格:

import Control.Monad

main = do
    n <- readLn
    replicateM_ n $ do
        [x, y] <- (map read . words) `liftM` getLine
        print $ gcd x y