记住您的第一次(在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/