Haskell:如何从标准输入中逐行读取值并将它们添加到 map 中?

标签 haskell map stdin

我想从标准输入读取字符串并将它们存储到 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/

相关文章:

haskell - 如何序列化 Thunk 或将其保存到文件中?

java - 将 POJO 转换为 <K,V> 映射

r - 在 R 中的 ggmap 对象上绘制 geom_segment - 线未出现

c++ - 使用 map::count 优化算法

戈朗 : Child Processes become Zombies

c - 修改 printf 输出

haskell - 如何对列表列表的相同索引求和?

data-structures - Haskell 的代数数据类型

Haskell:函数组合导致类型不匹配错误

c - scanf 不等待输入就返回 0