记住您的第一次(在Haskell循环中)

通过尝试一些Hackerrank问题,我试图教自己一点Haskell。

我正在考虑的问题涉及读取一组坐标(x1,y1)和(x2,y2)
确定由这些坐标绘制的多边形的周长。

到目前为止,这是我的代码:

-- Calculate length of line given points x1,y2, x2,y2
calc_length:: Int -> Int -> Int -> Int -> Float
calc_length x1 y1 x2 y2 =
       sqrt ( fromIntegral (height ^2 + width ^2)  )
       where height = abs( y2 - y1)
             width  = abs( x2 - x1)


main = do
        x <- readLn :: IO Double
        forM_ [1,2..(x / 2)] $ \lc -> do
           line1 <- getLine
           let wds1 = map (\str -> read str::Int) (words $ line1)
           line2 <- getLine
           let wds2 = map (\str -> read str::Int) (words $ line2)
           print ( wds1, wds2)

我的问题是我需要计算第一个和最后一个坐标之间的距离,即记住输入的第一对数字(存储在第1行中)。但是在多次迭代之后,第一对将丢失。我曾尝试使用全局变量来存储getLine的首次调用(但收效甚微,即使那行得通,但我认为这不会有所帮助。)

我感觉有一种我可以尝试的更实用的方法,但是却不知道该怎么做。

我并不是在寻找完整的编码解决方案,而只是将其指向更好的方向的一种方法。

有什么想法吗?

最佳答案

如果您需要不同地对待第一次迭代,则应该将其分开(如果我正确理解了您的问题)。您可以通过使用辅助函数来减少重复:

getNumLine :: IO [Int]
getNumLine = do
    line <- getLine
    return (map read (words line))

main = do
    x <- readLn :: IO Int   -- Double seemed wrong, use integer `div` below instead
    firstline <- getNumLine
    forM_ [2..x `div` 2] $ \lc -> do
        ...

是的,您可能对此有更多的“功能”,但是我认为最好是循序渐进地学习。

关于loops - 记住旧数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51118162/

10-12 21:43