轨道
/
Haskell
Haskell
/
练习
/
单词计数
单词计数

单词计数

中等

简介

你是一名高中英语老师,教学生把英语作为一门外语来学。

你决定把整个课程体系都建立在电视剧之上。 你需要分析剧中用了哪些单词,以及这些单词重复出现的频率。

这样你就能挑出最简单的剧集作为起点,再随着时间推移逐步提高难度。

说明

你的任务是统计一部剧的字幕中每个单词出现的次数。

这些剧的字幕只使用 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包。

测试套件有意设计成能接受几乎所有说得通的类型签名,所以鼓励你去找出自己认为最合适的那一种。


来源

这是一个经典的玩具问题,不过我们是在 Go Tour 中看到它后才想起来的。
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Haskell Exercism

准备好开始 单词计数 了吗?

注册 Exercism,借助 107 个练习 和真人导师指导,学习并掌握 Haskell,全部免费。