我刚刚开始学习haskell,它的思维方式与我习惯的方式(C 风格的语言)大不相同。
无论如何,对于我正在处理的一个问题,我需要接收用户输入。它将以形式出现
2
10
20
例如。格式是第一行表示后面的行数。我的第一个想法是我会阅读第一行,然后循环运行该次数。虽然这是 Haskell!据我所知,循环是不可能的。
我的下一个想法是,我将使用第一行输入来填充一个列表,其中包含后面的其他 n 个数字。我不知道我会怎么做。我在这里是因为我什至不确定我会寻找什么来解决这个问题。
提前感谢您向我展示了执行此操作的 Haskell 方法。到目前为止很难,但我听到“开明”的人的好评如潮,所以我认为自己学习语言不会有什么坏处。
这是可以运行一次的代码,但需要为第一行之后的第二行到 n 行中的每一行运行一次。
l n = (-1)^n/(2*(fromIntegral n)+1)
a m = sum [l n | n <- [0..(m-1)]]
main =
do b <- readLn
print (a b)
(另外,我很想听听我是否可以对我的代码进行其他改进,但在这种特定情况下,它是为了让比赛以尽可能少的字符数解决问题。我不想得到更多特别是在其他人试图寻找相同问题的答案的情况下。)
编辑:感谢大家的回答。我最终得到了一些我想要的东西。我将代码放在下面以供后代使用。可悲的是,即使它以出色的成绩通过了测试用例,但他们测试它的实际数据却不同,他们告诉我的只是我得到了“错误的答案”。此代码“有效”,但无法为您提供正确答案。
import Control.Monad
l n = (-1)^n/(2*(fromIntegral n)+1)
a m = sum [l n | n <- [0..(m-1)]]
main =
do b <- readLn
s <- replicateM b readLn
mapM_ print [a c | c <- s]