2015-10-25 2 views
0

Так у меня есть список слов и счетчики:Приращение счетчика для слова в списке слов и счетчиков

[("word1", 1), ("word2", 1)]

и мне было интересно, как я хотел бы увеличить счетчик для слова я добавить в этот список, например:

  • Если слово уже было в списке, то увеличиваем счетчик для этого слова:
    • counts "word1" [("word1", 1), ("word2", 1)] => [("word1", 2), ("word2", 1)]
  • В противном случае создать новый счет в списке:
    • counts "word3" [("word1", 1), ("word2", 1)] => [("word1", 1), ("word2", 1), ("word3", 1)]

Вот код, я пытался до сих пор:

fun counts w [] [(w, 1)] 
    | counts w ((hd, n)::tl) = 
     if(w hd) then (hd, n+1)::tl 
     else if(not(w hd)) then [(hd, n)]@[(w, 1)]@tl 
     else (hd, n)::tl; 

Я получив правильный вывод для второго случая, но для первого случая это t он выход я получаю:

counts "the" [("cat", 1), ("the", 1)]; 
val it = [("cat",1),("the",1),("the",1)] : (string * int) list 

ответ

1

Согласно детали, упомянутые Вами, это должно работать:

fun count w [] = [(w, 1)] 
| count w ((w', c)::tl) = 
    if w = w' 
    then (w', c+1)::tl 
    else (w', c)::(count w tl); 

count "the" [("cat", 1), ("the", 1)]; 
count "word1" [("word1", 1), ("word2", 1)]; 
count "word2" [("word1", 1), ("word2", 1)]; 
count "word1" []; 
count "word1" [("word1", 1)]; 
+0

Спасибо так много! Я получу его ха-ха, запутался с добавлением его в результирующий список ^^ – madcrazydrumma