haskell方式接受用户输入用户输入的次数?

时间:2013-02-03 00:36:24

标签: haskell

我刚刚开始学习haskell,这是一种与我习惯的(C风格语言)不同的思维方式。

无论如何,对于我正在处理的一个问题,我需要接收用户输入。它将以

的形式出现
2
10
20
例如,

。格式是第一行表示后面的行数。我的第一个想法是,我会读取第一行,然后循环运行这么多次。这是Haskell!据我所知,循环是不可能的。

我的下一个想法是,我会使用第一行输入来填充列表,其中包含其他n个数字。我不知道怎么会这样做。我在这里是因为我甚至不确定我会搜索什么来解决它。

提前感谢我向我展示了哈克尔的做法。到目前为止这很艰难,但我听到了那些“开悟”的人的好评,所以我觉得自己学习语言不会有什么坏处。

这里的代码只运行一次,但需要为第一行后面的第二行到第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]

4 个答案:

答案 0 :(得分:10)

首先,你可以在haskell中循环好。它一直在发生。你只是没有语法结构,因为不需要它们。

大多数情况下,常见的通用循环被放入库中。在这种情况下,您需要的循环位于模块Control.Monad中的标准库中。它被称为replicateM。它具有类型签名Monad m => Int -> m a -> m [a]。要为您的案例专门设置此签名,它的类型为Int -> IO Int -> IO [Int]。第一个参数是循环的次数。第二个是在每个循环上运行的IO操作。该函数的结果是一个IO动作,它产生输入列表。

因此,如果您将inputs <- replicateM b readLn添加到do块,它会将名为inputs的列表放入范围,其中包含第一个输入后b行输入的值。然后,您可以在这些行上映射解决方案功能。

答案 1 :(得分:6)

Carl的解决方案可行,但有点不透明。如果你想写出来,你可以这样做:

readLines :: Int -> IO [Int]
readLines 0 = return []
readLines n = do
   x <- fmap read getLine
   rest <- readLines (n-1)
   return $ x : rest

readSomeNumberOfLines :: IO [Int]
readSomeNumberOfLines = do
   n <- fmap read getLine
   readLines n

你在这里用readLines做的是你实际上是在定义明显的基本情况(读0事,只是给出一个空列表)和递归情况(读n事,读一件事) ,然后读取其他n-1个东西,然后将它们组合在一起)。

答案 2 :(得分:2)

我不确定你想要做什么 ,但要读取整数n然后接下来的n行作为整数,你可以做类似的事情:

import Control.Monad

-- read n, then sum integers read from the next n lines
test = do n <- readLn
          xs <- replicateM n readLn
          return $ sum xs

当然最后的return $ sum xs并不重要 - 如果它不存在,你需要test的显式类型签名。

如果您不理解任何这些功能,只需hoogle

答案 3 :(得分:1)

您可以创建readInput n,其中n是要读取的行数。每次从n递归地减去1的调用。我也是Haskell noob,所以这可能不是最好的方法。但它应该仍然有效。

相关问题