计算字符串列表中的字符串并将其转换为元组,如[(String,int)]|Haskell

计算字符串列表中的字符串并将其转换为元组,如[(String,int)]|Haskell,haskell,tuples,Haskell,Tuples,我的问题是如何实施这一点: import Data.Char import Data.List freq :: [String] -> [(String ,Int)] freq words = [] 在哈斯克尔。我想计算特定字符串在字符串列表中出现的次数。基本方法是: 对列表排序 将连续相等的元素累积到组中 计算每组的长度 所使用的功能是数据中的排序和分组。列表: sort :: Ord a => [a] -> [a] group :: Eq a => [a] -&g

我的问题是如何实施这一点:

import Data.Char
import Data.List

freq :: [String] -> [(String ,Int)]
freq words = []

在哈斯克尔。我想计算特定字符串在字符串列表中出现的次数。

基本方法是:

  • 对列表排序
  • 将连续相等的元素累积到组中
  • 计算每组的长度
  • 所使用的功能是
    数据中的
    排序
    分组
    。列表

    sort :: Ord a => [a] -> [a]
    group :: Eq a => [a] -> [[a]]
    
    工作原理示例:

    group [1,1,1,2,3,3,4]  -> [ [1,1,1], [2], [3,3], [4] ]
    
    因此,现在必须将一组相等的元素,如
    [1,1,1]
    转换为元组
    (1,3)
    。我会留给你去弄清楚的

    freq
    的完整定义如下所示:

    freq :: [String] -> [ (String,Int) ]
    freq xs =  map pair (group ( sort xs ))
      where pair = ...(your definition here)...
    

    如评论中所述,使用
    Data.Map

    freq :: [String] -> [(String ,Int)]
    freq words = toList $ fromListWith (+) [(w, 1) | w <- words]
    
    freq::[String]->[(String,Int)]
    freq words=toList$fromListWith(+)[(w,1)| w可能是您的朋友。您可能希望使用具有类型签名
    [a]->a->Int
    的函数。hoogeling后,您将立即发现:

    elemIndices::Eq a=>a->[a]->[Int]
    基本数据列表
    
    elemIndices函数通过按升序返回与查询元素相等的所有元素的索引来扩展elemIndex。

    那么您在哪里有问题?查看数据中的函数。映射如果您首先编写
    freqMap::[String]->Map String Int
    一点提示从何处开始会很好。只需知道使用什么…@mojo92查看
    数据.Map
    ,其中有几个函数可以更新或插入
    映射中的键,因此实现这一点应该非常简单。或者,您可以对
    字符串列表进行排序insert1::String->[(String,Int)]->[(String,Int)]
    insert1 x m
    通过创建新项(x,0)将x插入列表m如果列表中不存在x,则将x的计数增加1。