Ми викладаємо англійську як іноземну учням старших класів.
Ми вирішили побудувати всю навчальну програму на телесеріалах. Потрібно проаналізувати, які слова використовуються і як часто вони повторюються.
Це дозволить обрати найпростіші серіали для початку й поступово підвищувати складність із часом.
Потрібно порахувати, скільки разів кожне слово трапляється в субтитрі драми.
У субтитрах цих драм використовуються лише символи ASCII.
Персонажі часто говорять невимушеною англійською, використовуючи скорочення як-от they're чи it's. Хоча ці скорочення походять від двох слів (наприклад, we are), саме скорочення (we're) вважається одним словом.
Слова можуть розділяти будь-які розділові знаки (наприклад, ":", "!" чи "?") або пробільні символи (наприклад, "\t", "\n" чи " "). Слова не розділяє лише апостроф у скороченнях.
Числа теж вважаються словами. Якщо в субтитрах сказано It costs 100 dollars., то 100 буде окремим словом.
Слова нечутливі до регістру. Наприклад, слово you трапляється тричі в такому реченні:
You come back, you hear me? DO YOU HEAR ME?
Порядок підрахунків слів у результатах не має значення.
Ось приклад, який поєднує кілька описаних вище елементів:
"That's the password: 'PASSWORD 123'!", cried the Special Agent.\nSo I fled.
Ось відображення для цього субтитру:
123: 1
agent: 1
cried: 1
fled: 1
i: 1
password: 2
so: 1
special: 1
that's: 1
the: 2
Щоб виконати цю вправу, потрібно реалізувати функцію wordCount,
яка приймає текст і повертає, скільки разів зустрічається кожне слово.
Якщо цю вправу розвʼязувати вперше, радимо дотримуватися наведеної сигнатури:
wordCount :: String -> [(String, Int)]
Пізніше варто повернутися до цієї задачі та поекспериментувати з іншими типами даних і бібліотеками:
Text з пакета text.Map з пакета containers.MultiSet з пакета multiset
Набір тестів навмисно створено так, щоб приймати майже будь-яку сигнатуру типу, яка має сенс, тож радимо пошукати той варіант, який видається найкращим.