Haskell使用Map统计影迷观影次数 统计长度恒返回1问题求助
问题原因
- 你当前写的
titlesFan函数类型签名和实际返回值不匹配:Map.fromListWith返回的是Map映射结构而非列表,需要调用Map.toList才能转为你声明的[(k, [a])]类型。 - 你统计长度得到全1的核心原因是没有正确对每个影迷对应的观影列表求长度,大概率是误对映射转列表后的外层元素做了计数,而非取每个键对应的值(观影列表)计算长度。
解决代码
首先需要导入依赖的模块:
import qualified Data.Map as Map import qualified Data.Set as Set -- 如果需要去重统计观影部数则导入
版本1:统计总观影次数(同一影迷看同一部电影多次算多次)
完全符合你的示例输出要求,仅用Map实现:
type Fan = String type Title = String type Review = Int type Film = (Fan, Title, Review) filmRating :: [Film] -> [(Fan, Int)] filmRating l = Map.toList $ Map.map length $ Map.fromListWith (++) [(f, [t]) | (f, t, _) <- l]
版本2:统计观影部数(同一影迷看同一部电影多次仅算1次,用到Set实现)
符合要求同时使用Map和Set的场景:
filmRating :: [Film] -> [(Fan, Int)] filmRating l = Map.toList $ Map.map Set.size $ Map.fromListWith Set.union [(f, Set.singleton t) | (f, t, _) <- l]
内容的提问来源于stack exchange,提问作者user17468100
相关产品推荐
相关产品推荐

