我是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教程,但未找到有关此特定问题的任何信息。
答案 0 :(得分:3)
你非常接近。在调用gcd
之前,没有理由转换为元组或元组列表。
main = do
contents <- getContents
print $ map ((\[x,y] -> gcd (read x) (read y)) . words) . lines $ contents
所有有趣的内容都在print
和contents
之间。 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