Haskell-读入用户输入的数字字符串并将其添加

时间:2018-11-30 20:35:58

标签: haskell

我早些时候问了一个问题,但问题多于答案。

我希望能够执行以下操作:在列表中输入整数数,然后输入数字列表。

示例

<button mat-button>

OR

4 1 2 3 4

现在,我的以下代码无法正常工作。

8 1 2 3 4 5 6 7 8

1 个答案:

答案 0 :(得分:1)

如果只需要输入一行,则不需要包含数字的数量,因为您只需要在空白处拆分行即可获得列表。

foo :: IO [Int]
foo = do
   putStr "Enter your numbers, separated by whitespace (e.g. 4 5 3 2): "
   line <- getLine
   return $ map read (words line)

words将类似2 3 4 5的输入拆分为列表["2", "3", "4", "5"]

如果要控制输入多少个数字,并为每个数字单独提示,则需要replicateM

-- No error handling or line editing, for simplicity
foo' :: IO [Int]
foo' = do
    putStr "How many numbers?: "
    n <- readLn
    replicateM n $ do
      putStr "Enter a number: "
      readLn

readLn等效于fmap read getLine;您得到一行输入,对结果字符串调用read

replicateM采取由嵌套IO块定义的do动作作为第二个参数。您正在传递未定义的变量action。该操作产生一个IO Int值,replicateM重复n次,并将所得的IO Int值合并为一个IO [Int]值。 (replicateMreplicate之间的区别是,[IO Int]会产生一系列动作,foo。)


由于foo'IO [Int]都被声明为read类型,因此编译器可以推断出readLnclass Fibonacci: memo = {} def fibo(self, n): if n in self.memo: return self.memo[n] if int(n) == 0: value = 0 elif int(n) == 1: value = 1 else: value = self.fibo(int(n) - 1) + self.fibo(int(n) - 2) self.memo[n] = value return value 的使用正确的特定类型。