【问题标题】:counting no of times each word is repeated using haskell使用haskell计算每个单词重复的次数
【发布时间】:2014-01-07 02:08:46
【问题描述】:

我是 Haskell 和函数式编程的新手...

我想将函数作为字符串传入,并计算每个语法(例如 (if,else, elseif for, while, dowhile) 在使用 haskell 的函数中存在的次数。

如果给出这样的输入示例

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--;}}

我期待输出。(它必须给出每个语法出现的次数)

[(if,2),(for,2),(elseif,1),(else,1),(while,1)]

我已经完成了编码。如下图

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)]

谁能帮我摆脱所有不需要的东西并得到这样的结果..

[(if,2),(for,12),(elseif,1),(else,1),(while,1)]

【问题讨论】:

    标签: haskell functional-programming


    【解决方案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 qualified Data.Set as Set
    
    allKeywords :: Set.Set String
    allKeywords = Set.fromList ["if", "else", "elseif", "for", "while"]
    
    keywords = filter (`Set.member` allKeywords) . words . map removePunc
      where removePunc c = if isAlpha c then c else ' '
    

    【讨论】:

    • 谢谢。克里斯.. 你能解释一下这个 import qualified Data.Map as Map 的作用吗..
    • @Sathyabaman 为了简单起见,我实际上删除了该行。但它导入模块Data.Map,但导入它qualified,因此您必须通过在它们前面写Data.Map. 来明确声明您正在使用该模块中的函数。通过编写import qualified Data.Map as Map,我给它起了一个短名称Map,这样我就可以将它的函数用作Map.insert,而不是Data.Map.insert
    • keywords 可以是Data.Text.split (not isAlpha)
    • @misterbee 你实际上需要keywords = filter (not . Text.null) . Text.split (not . isAlpha) 来过滤掉空字符串。
    • 同意。在移动设备上,之前没有得到完整/正确的测试答案。只是想指出Data.Text.split
    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多