我早些时候问了一个问题,但问题多于答案。
我希望能够执行以下操作:在列表中输入整数数,然后输入数字列表。
示例
<button mat-button>
OR
4 1 2 3 4
现在,我的以下代码无法正常工作。
8 1 2 3 4 5 6 7 8
答案 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]
值。 (replicateM
和replicate
之间的区别是,[IO Int]
会产生一系列动作,foo
。)
由于foo'
和IO [Int]
都被声明为read
类型,因此编译器可以推断出readLn
和class 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
的使用正确的特定类型。