我想从标准输入读取字符串并将它们存储到 map 中,其中 key
是输入字符串和 value
是此字符串之前出现的次数。在 Java 中,我会做这样的事情:
for (int i = 0; i < numberOfLines; i++) {
input = scanner.nextLine();
if (!map.containsKey(input)) {
map.put(input, 0);
System.out.println(input);
} else {
int num = map.get(input) + 1;
map.remove(input);
map.put(input, num);
System.out.println(input.concat(String.valueOf(num));
}
}
我已经尝试在 Haskell 中使用
forM_
做同样的事情但没有运气。import Control.Monad
import qualified Data.Map as Map
import Data.Maybe
main = do
input <- getLine
let n = read input :: Int
let dataset = Map.empty
forM_ [1..n] (\i -> do
input <- getLine
let a = Map.lookup input dataset
let dataset' =
if isNothing a then
Map.insert input 0 dataset
else
Map.insert input num (Map.delete input dataset)
where num = ((read (fromJust a) :: Int) + 1)
let dataset = dataset'
let output = if isNothing a then
input
else
input ++ fromJust a
putStrLn output)
dataset
的内容在上面的代码中根本没有改变。
最佳答案
你的问题是 Map.insert
不做什么map.remove
在 C++ 中做。 Map.insert
返回一个包含元素的新 map ,但您只是将这个新 map 扔掉。这就是几乎所有 Haskell 数据结构的工作方式,例如代码:
main = do
let x = []
y = 5 : x
print x
打印空列表
[]
.缺点 :
运算符不会破坏性地修改空列表,而是返回一个包含 5
的新列表。 . Map.insert
做同样的事情,但使用 map 而不是列表。
关于Haskell:如何从标准输入中逐行读取值并将它们添加到 map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20337613/