使用haskell计算每个单词的重复次数

使用haskell计算每个单词的重复次数,haskell,functional-programming,Haskell,Functional Programming,我是Haskell和函数编程的新手 我希望以字符串形式传入函数,并计算使用haskell的函数中存在的每种语法(if、else、elseif for、while、dowhile)的次数 例如,如果给出这样的输入 if(i=0){ for(i=0;i<num;i++){if(name== name)} }elseif (i=3){for(i=3;i<num;i++){}} else{while (i>3){name = name; i--;}} 我已经完成了编码。如下图所示

我是Haskell和函数编程的新手

我希望以字符串形式传入函数,并计算使用haskell的函数中存在的每种语法(if、else、elseif for、while、dowhile)的次数

例如,如果给出这样的输入

if(i=0){  for(i=0;i<num;i++){if(name== name)}
}elseif (i=3){for(i=3;i<num;i++){}}
else{while (i>3){name = name; i--;}}
我已经完成了编码。如下图所示

import Control.Arrow

syntaxCount :: String -> [(String, Int)]
syntaxCount = map (head &&& length) . group .sort  . words
此函数起作用,但其结果如下所示

[("(i=3){for(i=3;i<num;i++){}}",1),("(i>3){name",1),("=",1),("else{while",1),("for(i=0;i<num;i++){if(name==",1),("i--;}}",1),("if(i=0){",1),("name)}",1),("name;",1),("}elseif",1)]

我将其拆分为一个函数,该函数生成输入字符串中的关键字列表,以及一个对列表中不同元素进行计数的函数

import Data.Char
import Control.Arrow

keywords :: String -> [String]
keywords = words . map (\x -> if isAlpha x then x else ' ')

count :: Ord k => [k] -> [(k,Int)]
count = map (head &&& length) . group . sort
然后您可以将
syntaxCount
定义为一个简单的组合

syntaxCount = count . keywords
比如说

>> let inp = "if(i=0){  for(i=0;i<num;i++){if(name== name)}\n}elseif (i=3){for(i=3;i<num;i++){}}\nelse{while (i>3){name = name; i--;}}"
>> syntaxCount inp
[("else",1),("elseif",1),("for",2),("i",10),("if",2),("name",4),("num",2),("while",1)]

我将其拆分为一个函数,该函数生成输入字符串中的关键字列表,以及一个对列表中不同元素进行计数的函数

import Data.Char
import Control.Arrow

keywords :: String -> [String]
keywords = words . map (\x -> if isAlpha x then x else ' ')

count :: Ord k => [k] -> [(k,Int)]
count = map (head &&& length) . group . sort
然后您可以将
syntaxCount
定义为一个简单的组合

syntaxCount = count . keywords
比如说

>> let inp = "if(i=0){  for(i=0;i<num;i++){if(name== name)}\n}elseif (i=3){for(i=3;i<num;i++){}}\nelse{while (i>3){name = name; i--;}}"
>> syntaxCount inp
[("else",1),("elseif",1),("for",2),("i",10),("if",2),("name",4),("num",2),("while",1)]

非常感谢。克里斯。。你能给我解释一下这个导入限定数据是什么吗。映射为映射。@Sathyabaman为了简单起见,我实际上删除了这一行。但是它导入模块
Data.Map
,但是导入它是限定的,因此您必须通过在前面写入
Data.Map.
来明确声明您正在使用该模块中的函数。通过编写
import qualified Data.Map as Map
我给了它一个简称
Map
,这样我就可以使用它的函数作为
Map.insert
而不是
Data.Map.insert
关键字可以是
Data.Text.split(不是isAlpha)
@misterbee您实际上需要
关键字=过滤器(不是.Text.null)。Text.split(not.isAlpha)
过滤空字符串。同意。在手机上,以前没有得到完整/正确的测试答案。只想指出
Data.Text.split
谢谢。克里斯。。你能给我解释一下这个导入限定数据是什么吗。映射为映射。@Sathyabaman为了简单起见,我实际上删除了这一行。但是它导入模块
Data.Map
,但是导入它是限定的,因此您必须通过在前面写入
Data.Map.
来明确声明您正在使用该模块中的函数。通过编写
import qualified Data.Map as Map
我给了它一个简称
Map
,这样我就可以使用它的函数作为
Map.insert
而不是
Data.Map.insert
关键字可以是
Data.Text.split(不是isAlpha)
@misterbee您实际上需要
关键字=过滤器(不是.Text.null)。Text.split(not.isAlpha)
过滤空字符串。同意。在手机上,以前没有得到完整/正确的测试答案。只是想指出
Data.Text.split